Enumerate over dictionary keys and values without allocations

## "Work In Progress"

This pull request offers an alternative to #147. It eliminates the allocations when evaluating the `Keys` and `Values` properties of `ImmutableDictionary<TKey, TValue>`, but does so without increasing the allocated size of an `ImmutableDictionary<TKey, TValue>` instance.

The documentation associated with the members created by this pull request do not currently meet my own quality standards, but I sent the pull request before going through that part in detail in order to get early feedback. If the community believes this approach is the desired implementation for this functionality, I will go back through the documentation in detail.
@pdelvo In other words revert this part of the change as @sharwell suggested he'd do next. :)

I don't think the extra code for the key and value enumeration is worth it if won't save on boxing for existing code. Consumers needing maximum efficiency can already get it with just one extra line of code:

**Before:**
```C#
foreach (var key in dictionary.Keys) {
   ...
}
```

**After:**
```C#
foreach (var pair in dictionary) {
    var key = pair.Key;
    ...
}
```

As such, I suggest we leave things as they are.