Functional memory cache implmenation

Here is a functional baseline cache implementation. At this point we are only establishing behavior and usage patterns and writing unit tests and samples to verify those patterns. Please limit any performance related comments limited to architectural level issues.

What's implemented:
- Set, TryGetValue, Remove, extensions
- Eviction callbacks
- Active triggers with callbacks
- Checking for time and lazy trigger expiration when retrieving items.

What not implemented:
- Background expiration detection for time or lazy trigger based expiration.
- Memory pressure monitoring or cleanup.
InvalidOperaitonException is more often used for caller error (e.g. Start must be called before Stop). NotImplementedException is usually added as a to-do when VS generates code (e.g. implement interface), but we replace it with NotSupportedException if we choose not to support that code path. In this case I think it's appropriate to say use NotImplementedException to show that we're in a new unknown state and need to make a decision on how to handle it.  The closest alternative would be a Debug.Assert(false).