Add support for in-place map for `Vec`s of types with same size (take 3)

This is implemented using a new struct PartialVec which implements the proper
drop semantics in case the conversion is interrupted by an unwind.

For the old pull requests, see #15302, #16369.

Oh, really? So the following is technically undefined?

```rust
let p = some_vec.as_ptr();
let q = p.offset(10);
let r = q.offset(-10);
```

However, it doesn't particularly matter since `offset` is *widely* used with the output of `len()`; this is not an unusual case (e.g. `some_slice.iter()` is created with `offset` and `len`).