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
Doesn't seem to work for me :(

    /home/ben/devl/rust/rust/src/libstd/collections/hash/map.rs:1205:32: 1205:33 error: expected one of `,` or `{`, found `?`
    /home/ben/devl/rust/rust/src/libstd/collections/hash/map.rs:1205     where Q: Eq + ToOwned<K> + ?Sized