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.
Not sure how this stuff works, but does this mean that every test in this assembly, no matter what, will cause a Redis server to start and stop? (That is, even the tests that just do some arg checking and don't talk to a server?)