Intern strings when reading module metadata from cache Dependency resolution of large dependency graphs involves a significant number of comparisons of strings(group, artifact, version, ...). Most of those come from the module metadata cache, and even if we use hashmaps, we still need to perform `equals` comparisons on strings, when in most of the cases they should be identical. This commit takes advantage of knowing that to add a cost when we read module metadata (interning), but realizing that the debt is paid when comparing strings during resolution.
The interner is build scoped (in order to avoid memory leaks), thread-safe, and shared with the dependency notation converter, so that module selectors created from strings found in the build scripts are using the same strings as the ones from the module metadata cache.
Ideally, we should also do this for the strings used during parsing.