Initial work on Caching middleware.

Not particulalry happy with the way the cache key and vary parameters are
being generated. I'm hoping that the current implementation can be a suitable
low-level approach that handles all the cases, but that we can then add
various KeyGenerator implementations that handle the common cases (somewhat
the way routing works).

The initial storage engine will be ccache, but I need to make it support
variations. Also need to fetch on grace mode and eventually add purging
support. Not sure how best to authenticate that yet.
merged
Cache engines are now stored in the caches subpackage.

Started to port ccache, namely to support variance. Seems to be working,
but bucket tests are broken.
CCache tests now work with variance.

Also, ccache garbage collector properly deletes individual variant items.
grace mode is working
Started to add tests around caching middleware. Not crazy about how these
are turning out. Gonna stick with it for now, skipping any extreme case,
and just gonna have to rely on the [future] integration tests.
More caching tests. Fixed grace mode.

Rather than saint being on/off, it's now configured as a duration, which
specified how long to extend the cache in the case of a failure.
Merge branch 'caching'