Useful Map that does not care about the case-sensitivity of keys
when the key value is a String. Other key types can be used.
String keys will be treated case insensitively, yet key case will
be retained. Non-string keys will work as they normally would.
The internal CaseInsentitiveString is never exposed externally
from this class. When requesting the keys or entries of this map,
or calling containsKey() or get() for example, use a String as you
normally would. The returned Set of keys for the keySet() and
entrySet() APIs return the original Strings, not the internally
wrapped CaseInsensitiveString.