Upgrade to new entry API in RFC 509 (https://github.com/rust-lang/rust/issues/19986)

TODOs:
  - ~~Entry is still `<'a, K, V>` instead of `<'a, O, V>`~~
  - ~~BTreeMap is still outstanding~~.
  - ~~Transform appropriate things into `.entry(...).get().or_else(|e| ...)`~~

Things that make me frowny face:
  - I'm not happy about the fact that this `clone`s the key even when it's already owned.
  - With small keys (e.g. `int`s), taking a reference seems wasteful.

r? @Gankro
cc: @cgaebel
I think this code is less readable to people who don't know exactly what `entry` and `Entry::get` do. To those people, the only indication of what `unwrap_or_else` is actually doing (and when it does it) is the name `vacant_entry`. I'm also not particularly convinced either way on this, but the diff does trigger some Haskell-inspired worries.