Add abstract dependencies

Background

As part of #776, we must introduce the concept of 'abstract dependencies' to allow test elements to be added into the build plan of a given element without necessarily consuming the output of the test elements.

Task description

For more detail, see the 'Create a new kind of dependency' section in the full proposal from the mailing list

  • When an element A specifies a condition-requirement on element B, calculate element A's 'abstract' dependencies from the condition-providers of element B and element B's 'normal' dependencies (see the figure under part 2 in the mailing list proposal)
  • Add functionality to Element.dependencies() to optionally include abstract dependencies
  • Include abstract dependencies in calculation of the cache key
  • Include abstract dependencies in calculation of the build plan
  • Don't include abstract dependencies in staging dependency artifacts

Acceptance Criteria

Abstract dependencies are introduced such that they:

1.) do not care about the output of the element that is 'abstractly' depended on

2.) function like 'normal' dependencies with regards to cache key calculation and build plans

3.) do not need to be explicitly stated in a bst element file, but are implied when an element specifies a condition-requirement on its dependencies