Support requested capabilities on external dependencies This commit adds support for having requested capabilities part of the module component selector, for external dependencies. This means that if a component is using Gradle metadata, we can read requested capabilities and honor them during selection.
This reworks where requested capabilities are stored, and in particular moves them to the `ComponentSelector`, making them properly part of the identity of a dependency. As such, two dependencies requiring two different variants by using distinct capabilities will now properly appear as two different dependencies in the dependency graph, instead of two variants of the same dependency.
Normalize `ModuleIdentifier` This commit reworks the `ComponentModuleIdentifier`/`ComponentModuleSelector`/`ModuleVersionSelector` classes to use `ModuleIdentifier` under the hood, instead of storing denormalized strings. This has the advantage that we can reduce the use of the module identifier factory, which is called very often during dependency resolution. Sharing instances reduces the need for conversions, and makes comparisons faster.