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.

Integration into what-changed will be a follow-up if/when this lands.

Testing Done:
./pants goal test tests/python/pants_test/base:lazy_source_mapper
https://travis-ci.org/pantsbuild/pants/builds/44622933

Bugs closed: 882

Reviewed at https://rbcommons.com/s/twitter/r/1526/
Sync of https://github.com/pantsbuild/pants/commit/e5cca4c1661235eedb4050db185f34c6edade820