Move the target getting logic from the PressureSolver into the new TargetCalculator
Rename TargetCalculator#getAvailableTargetsForPipe to getGroupForPipe
Wrap targets returned by getGroupForPipe in an object
Include the full pipes traversed in the group returned by getGroupForPipe
Add caching to getForVertex
Create getCachedGroupsContainingTargetPipe method
Create the mergeGroups method so that getForVertex can merge getGroupForPipe groups without creating duplicates
Add the uncacheGroup method
Add the pipeFull method that updates the cache
Add the pipeEmpty method for clearing the cache
Always return a group with the same structure from getGroupForPipe