allocation optimizations for immutable collections

requesting the Keys or Values of an immutable (sorted) dictionary allocates every time. In scenarios where a dictionary is setup and then used repeatedly, this is inefficient.
Also in the published [coding style guidelines](https://github.com/Microsoft/dotnet/blob/master/CONTRIBUTING.md) is the requirement that we always explicitly specify visibility on members. Can you please add `private` to each of the new members you've added?