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.
Validate that each selected artifact is compatible with the requested attributes and no transform is available to produce a variant that is compatible, instead of ignoring the artifacts that are not compatible, now that selection makes the decision of which artifacts to include based on variants instead making the decision per artifact.