Distributed Cache & Session

This includes IDistributedCache, a Redis implementation, an MemoryCache implementation.

It also includes Session middleware.

See https://github.com/aspnet/HttpAbstractions/pull/138 for related object model additions.

The goal is to get this reviewed and merged before continuing on with the concurrency work. It's expected that IDistributedCache design will need adjustments at that point, so please focus on the Session API and behaviors for now.
Yeah, the caches themselves are less likely to be put in the DI container because they represent multiply occurring resources, not singleton services.  I made MemoryCacheOptions implement IOptions so it could be passed in directly: `new MemoryCache(new MemoryCacheOptions())`.  As such we support two scenarios:
1. One cache, with one set of options, all resolved from DI.
2. Multiple caches, with multiple options, all resolved manually without DI.