Detangle ivy module descriptor parser This commit removes the Ivy module descriptor parser as a service, because it unfortunately introduced a lot of tangling between projects, making it necessary to introduce `project(':ivy')` as a dependency to almost all projects.
This commit removes the parser as a service and creates it on demand. It should not have a big impact on performance since there should be only one instance in global scope, through `IvyResolver`.
Cache module version identifiers In a similar way to module identifiers, use the module identifier factory to cache the module version identifiers. It allows faster comparisons as we will hit `a==b` much more often and don't have to go the `equals` route. There are still places where the factory is not used, but it doesn't seem to have a huge impact on performance.