Register engines to individual sources

## Goal

Alter the config API to move engine registration to the individual sources that are configured.  This mean per-source engine configuration.  This means engines (and their options, etc) are "sandboxed" to the sources that register them.

This is important because an engine may need different settings based on the source files it is being run against (for example, which path to import partials relative to).  Plus, not all engines apply to all sources.  Now 3rd-party tools can not only configure their source, but everything needed to compile that source with the relevant settings specific to the 3rd-party tool.

## Implementation

To accomplish this, a source file must first know which source it came from. We use a similar algorithm to looking up source files by digest path (`find_by_digest_path`).  The sources are scanned for ones where the source path is included in the source file path.  If multiple match, the last matching one is chosen to match the last matching source file path in the digest lookup.

Next, the config API needs to be altered to move the engine registration api down to the source model.  This allows you to register engines on sources the same way you previously registered them globally.

Finally, everything is switched to using the source-specific engines.

## Bonus

All registered engines are now given a `source_path` option by default.  This option is the path of the source the engine was registered on and may be useful in referencing other files (like partials) with source-relative paths.