Implementation for provided and optional

* Introduces a `provided` configuration.
* Introduces an `optional` attribute.
* Handles configurations for publishing to Ivy and Maven repos.
* Added unit/integration tests.

This should probably become a "regular" Gradle plugin. At the moment there's no direct dependency on another Nebula plugin.
The moment you access the extension, the `DeferredConfigurable` functionality kicks in which prevents it from being changed after resolving it. I don't think there's a "good" way around it.