combinations: have the source cache get its data from a set of files

This is the first step to implementing combinations.  It alters the
source cache to get its data from a set of source files, rather than
just a single source file.

It has been backported here where the single source file from the
previous implementation is the only file in the set of source files.
In coming commits combinations will be used to drive multiple files
in the set of source files.
combinations: rename source cache to source proxy

This is a more accurate name for the purpose of this object.  It
proxies the source file(s) from the asset file that accesses their
data.  It abstract and handles the source files themselves (with
soon-to-be-combination handling), source data access, and cacheing.

No behavior changes - although this did expose some law-of-demeter
violations that I cleaned up both in the request and dassets_tests.
combinations: allow registering combinations at config time

This adds a combination registration api to the config.  You add
combinations by giving the combination digest path and the list of
source digest paths it maps to.

This will be used by the proxy to 'look up' the source digest paths
for the given digest path.  Combinations return the keyed digest path
in the case no combination has been registered.  This allows digest
paths to 'pass thru' if not registered as a combination.
combinations: have source proxy use them when looking up source files

This has the source proxy use combinations to look up source digest
paths.  This means that if a combination is registered for the digest
path, the proxy will abstract the combination sources.

Tests are added to ensure the proxy aggregates the source data across
multiple sources appropriately.  This ties together the previous
combination commits and completes the combinations feature.
Merge pull request #47 from redding/kr-combinations

Combinations