It would actually be pretty nice for this to be one allocation. In theory one day our allocations will `fail!()` instead of aborting, and in that case if `vals` failed to allocate it would leak `keys` and `hashes`.

This isn't super pressing, and perhaps we shouldn't be dealing with alignment problems at all, but it would be nice to be able to deal with `malloc_raw` unwinding.