Refactor `Vec::map_in_place` to move code out of `PartialVec`

Additionally, support zero-sized types.
auto merge of #17381 : tbu-/rust/pr_mapinplace2, r=aturon

Additionally, support zero-sized types.

Now there isn't a safe interface of `PartialVec` anymore, it's just a bare data structure with destructor that assumes you handled everything correctly before.