Implementation of 'DefaultMap' and 'getOrElse'.

Closes #152.
It's faster if you only use `containsKey` if the value is null, so that for non-null values the hashcode is only computed once:

```
dynamic getOrElse(Map m, key, orElse()) {
  var value = m[key];
  return (value == null && !m.containsKey(key)) ? orElse() : value;
}