Optimized HashMap. RawTable exposes a safe interface. (reopen)

This is #15720, rebased and reopened.

cc @nikomatsakis
Just making sure I understand: This is written in this weird way because it's undefined behaviour to have a ptr to unallocated memory (although it's fine to have one just after allocated memory, this does not apply to *just before*)?

Further, you track how many elements are left to avoid doing a bounds-check inside the loop?