Initial support for optional features This commit introduces initial support for optional features, by implementing a way for a dependency declaration (currently *only* in the DSL) to request variants of the target component that provide one or more capabilities.
Previously to this change, selection was (simplified) done like this:
1. find the target component 2. select the variant of the target component which matches the requested attributes
Now, selection introduces another step:
1. find the target component 2. filter variants by eliminating those which do not provide the requested capabilities 3. select the variant in this list which matches the requested attributes
Several changes had to be implemented:
First, component metadata rules calling `addCapability` will now return a component which capabilities _include_ the default capability. Second, attribute filtering is done in a secondary step, which means that if there are no variant matching the requested capabilities, we will immediately fail.