Refactor WhatChanged into base class, use LazySoruceMapper

Switch to using LazySourceMapper to map changed files to targets.
LazySourceMapper is designed to map sources to targets without
loading any more of the BUILD graph than is required, which is
ideal for a what-changed use-case.

Refactoring the what-changed calculation into base class should make
it easier to support other tasks that require the set of changed
targets (or files). The WhatChanged task itself is now just a small
stub on top of it.
Add changes-in-diffspec option to what-changed

Instead of looking at changes in the workspace relative to some parent ref/treeish, this
allows finding targets changed by some diffspec that is meaningful to the scm, eg a commit
SHA, a commit range, or other ref/ref-range.