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

This is #15720, rebased and reopened.

cc @nikomatsakis
Might also be cleaner to refactor the loop into:
```
loop {
    if gap.full().distance() != 0 {
        return retval;
    } else {
        gap = match gap.shift() {
            Some(b) => b,
            None => return retval
        };
    }
}
```
Although I don't know enough about rust internals to know if this will somehow degrad