Some changes to make calculation of paths for various domain objects more memory efficient. - Added `Path.child()` to more efficiently calculate a child path rather than converting to absolute path and parsing. - Removed duplicate copy of full path held in `Path` instances. - Use `Path` to represent paths in various domain objects, rather than converting from String to Path and back.
Optimize performance of org.gradle.util.Path.toString() - this is a bottleneck for AbstractProject.getAllprojects and AbstractProject.getSubprojects - reason is that AbstractProject.compareTo calls Path.toString a lot when sorting projects added to a TreeSet