Initial IDistributedCache abstraction and implementations.

This includes:
- The IDistributedCache abstraction
- An implementation using MemoryCache
- An implementation using Redis.

This does not include
- Any serialization helpers
- Any concurrency controls (optimistic, locking, etc.).

Notes:
- Resis does not have any notion of sliding expiration, only absolute expiration. It does allow a single entry to contain multiple key-value pairs of data. We use this to store the absolute and sliding expiration values with the data and retrieve them later when we want to re-calculate the expiration.
- Some redis operations are best implemented via LUA script sent to the server. I've done the critical ones that way so far, but there are a few more (like refresh) that could be optimized via script.
Yup, I already made the interface implementation explicit to hide it.

I don't think this is something we'd need to do for all the middleware options. Developers don't call the middleware constructors directly. Adding just one DirectOptions(T options) interface implementation that the extension methods could use might suffice.

RedisCache & MemoryCache are different in that their constructor may be called by the developer directly.  What other non-middleware types do we have that take options?