Introduce ability to declare attributes on dependencies This commit introduces the possibility to declare attributes on dependencies. Attributes are, currently, unused. You can declare them, but they do not participate in dependency resolution. Attributes can be mutated using the `attributes(Action<? super AttributeContainer>)` method.
Implementation wise, in order to avoid memory overhead, an attribute container is lazily created whenever attributes are added. This forces us to pass the attribute factory down to the various concrete dependency implementations. However, we do this by setter injection, when a dependency or constraint is created using the container. This means that we can potentially miss injecting the factory for dependencies which were created in an adhoc manner, which can happen in plugins which use internal APIs. A warning is issued if we find such a dependency.