implement entry API for HashMap

Deprecates the `find_or_*` family of "internal mutation" methods on `HashMap` in
favour of the "external mutation" Entry API as part of RFC 60. Part of #17320,
but this still needs to be done on the rest of the maps. However they don't have
any internal mutation methods defined, so they can be done without deprecating
or breaking anything. Work on `BTree` is part of the complete rewrite in #17334.

The implemented API deviates from the API described in the RFC in two key places:

* `VacantEntry.set` yields a mutable reference to the inserted element to avoid code
duplication where complex logic needs to be done *regardless* of whether the entry
was vacant or not.
* `OccupiedEntry.into_mut` was added so that it is possible to return a reference
into the map beyond the lifetime of the Entry itself, providing functional parity
to `VacantEntry.set`.

This allows the full find_or_insert functionality to be implemented using this API.
A PR will be submitted to the RFC to amend this.

[breaking-change]
@pczarn Yeah, the exact assumptions we make about keys is kind of an open question here. *strictly* speaking, it's possible to write Eq in a way that isn't just total byte-wise equivalence, which is the general convention now (modulo ptr addresses). It's also possible to have Keys that impl Drop, so which key lives or dies is kind of important here. We also might want to retrieve self.key in the future for similar reasons. I'm reasonably confident that 99.99% of all code simply does not care about the actual individual keys and their lifetimes, but I'm unclear as to if we're willing to make the optimization and say "100% of the code *must not* care".

For now, I believe keys being swapped was part of the proposed RFC API, so I'm just going to stick to that. I'll be writing up a post on `discuss` about this, because I'm tired of thinking about it.

There appears to be a consensus on the fact that holding/swapping the hash is wasteful, so I'll probably refactor this to use `swap`. Although `into_mut` isn't sufficient to impl this, it is thankfully a trivial impl.