Updated performance spec.
In-memory caching of dependency metadata. Some preparation before merging from the branch. Refactored code so that I can reuse it easier. Moved DefaultArtifactIdentifier to coreImpl where it belongs.
First stab at caching the dependency metadata in memory. Certain builds are faster by up to 30% with this change.

1. This is a breaking change because we no longer check local repository dependencies with each resolve (unless we're tight on heap space - read on). Also, remote repository dependencies don't expire during the build (dynamic versions and changing modules). There may be use cases that need this feature, hence we plan to add a configuration option to turn off the in-memory dependency metadata cache. To recap: this is a potentially breaking change, however it should make the builds more consistent.
2. The cache data is managed by our 'top level' services registry. This means it lives only within a given build. The new top level services for dependency management require a review and more work (e.g. other dependency management services should be managed at a build level, or even globally etc.)
3. Different repositories are separated. E.g. there's a different instance of cache data for every different repository. Repositories are identified by their 'id'. This is required because modules with the same identifier may be different in different repositories.
4. I've added basic integ test coverage. It's tricky to integ test this feature because it's contract is really 'make the resolution faster'. There's a chance the new integ tests turn out flaky. Some unit test coverage is missing (next push).
5. The cache uses soft maps to avoid heap pressure. At this stage, I don't have evidence it uses more or less memory - we'll see what the performance tests say.

Documentation is missing yet, I'm working on it. I wanted to get this change soaked by our CIs and performance tests.

Please review!