Introduce ecosystem registration
This commit introduces the concept of "ecosystem", that can be
registered on an attributes schema. When a component is published,
it may provide a list of ecosystems. This list is used by consumers
when resolving. If, for some reason, variant resolution fails, and
that the consumer didn't use a plugin which provides the expected
ecosystem, the error message will indicate that they probably
miss a plugin that understands that ecosystem.
This is useful when a plugin extends an existing ecosystem with
additional attributes, that consumers may not be aware of. In
this case it is expected that the plugin declares an ecosystem.
Currently the error message will only indicate what ecosystem
is missing, and an optional description. It will not tell _how_
such plugin can be found, nor what plugins provide it.
By default, for adhoc components, publishing will use the
ecosystems of the producer. For example, for a Java project,
the published Gradle metadata file will include the java
ecosystem requirement.
For components which are not adhoc, they must implement the
`ComponentWithEcosystems` interface in order to tell which
ecosystems are in use.