message: Improve efficiency of KeyMap lookups
  Now uses separate maps for idsToKeys and keysToIds to make setting and
  getting one level less deep.
diff: @@ -8,10 +8,12 @@ import { Record } from './record';
  * @class KeyMap
  */
  export default class KeyMap {
  - private _data: Dict<any>;
  + private _idsToKeys: Dict<Dict<string>>;
  + private _keysToIds: Dict<Dict<string>>;
  constructor() {
  - this._data = {};
  + this._idsToKeys = {};
  + this._keysToIds = {};
  }
  /**
  @@ -25,7 +27,7 @@ export default class KeyMap {
  * @memberOf KeyMap
  */
  idToKey(type: string, keyName: string, idValue: string): string {
  - return deepGet(this._data, [type, keyName, 'idToKeyMap', idValue]);
  + return deepGet(this._idsToKeys, [type, keyName, idValue]);
  }
  /**
  @@ -39,7 +41,7 @@ export default class KeyMap {
  * @memberOf KeyMap
  */
  keyToId(type: string, keyName: string, keyValue: string): string {
  - return deepGet(this._data, [type, keyName, 'keyToIdMap', keyValue]);
  + return deepGet(this._keysToIds, [type, keyName, keyValue]);
  }
  /**
  @@ -59,8 +61,8 @@ export default class KeyMap {
  Object.keys(keys).forEach(keyName => {
  let keyValue = keys[keyName];
  - deepSet(this._data, [type, keyName, 'idToKeyMap', id], keyValue);
  - deepSet(this._data, [type, keyName, 'keyToIdMap', keyValue], id);
  + deepSet(this._idsToKeys, [type, keyName, id], keyValue);
  + deepSet(this._keysToIds, [type, keyName, keyValue], id);
  });
  }
  