base Engine class and NullEngine implementation

This is the base Engine for compiling and processing assets.  It
defines the API for an engine and should be subclassed when creating
new engines.

This also includes the NullEngine implementation.  It simply returns
exactly what it is given and can be thought of as a - it does nothing.
This will be used as the default engine for compiling assets.
rename config `sources` to just `source`

Little more straightforward since it is just a macro for setting
`source_path` and `source_filter` in DSL kinda way.
config api for registering engines

This adds an api to config for registering new engines with Dassets.
Registering involves building an instance of an Engine and associating
it with an input extension.  Engines can be looked up using the
`engines` reader on the config.

Engine authors would use this API to register their engines at
require-time, with something like:

```
require 'dassets'
Dassets.config.engine 'myext', Dassets::MyEngine, {'some' => 'opts}
``