Combinations

## Goal

Combinations are a way to host assets at a different digest path than what their source path compiles to.  Typically this can be used to 'combine' many source files into a single file for the purpose of digesting.  For example:

```ruby
config.combination 'css/base.css', ['css/reset.css', 'css/bootstrap.css']
```

However, combination _could_ be used to alias a single asset:

```ruby
config.combination 'css/web.css', ['css/app.css']
```

Either way, you can refer to both the combination digest path and the individual source digest paths and get the corresponding asset file.  Combination asset files do the obvious: they aggregate the source data for all of their files.

## Implementation

When a asset file for a digest path that is a combination does to get source data, the source proxy sees there are multiple sources from the registered combinations and aggregates the source data based on those multiple sources.  The result is the asset file isn't aware there are multiple source files backing it, it just gets data from the proxy as if a single source was backing it.

Data aggregation goes something like this:

* the latest mtime of all the sources is used as the asset's mtime
* the asset exists if all the backing sources exist
* the asset content is the compiled content of each source, joined with `"\n"`
* the asset fingerprint is the fingerprint of the asset content (same as with a single source)