Add bi-directional Map.

Bi-map supports a one-to-one key mapping with a (synchronized) inverse view.
```dart
BiMap map = new BiMap();
map[k1] = v1;
map[k2] = v2;
assert(map.inverse[v1] == k1);

map.inverse[v1] = k3;
assert(map[k3] == v1); // eliminates k1 mapping
assert(!map.containsKey(k1));
````