redesign: compile Engine definition and registration API

This has a few commits.  It defines the basic Engine model and a NullEngine implementation that returns anything it is given (a pass-thru essentially, a no-op).

It also defines the registration API on the config to allow associating Engines with input extensions.  This will be used when compiling source files.  By default, all extensions are registered with the NullEngine.

This also contains a minor commit renaming the `sources` config api to just `source`.  The commit justifies the rename (a cleanup really).  It doesn't really fit here, other than I noticed it should be cleaned up while working on the engine registration api.

@jcredding ready for review.