LazySourceMapper and tests

A LazySourceMapper attempts to find targets which own sources without
loading any more than is needed and caches its results.

This is intended for use in tasks like what-changed or (in the future)
goals which discover target to act on (eg 'compile-changed') or other
uses cases which want to map a source file to a target as cheaply as possible.