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'm not sure if `vacant_entry` is waranted. I would prefer a single char variable here (and elsewhere) to reduce noise. (willing to be convinced otherwise).