Revamp Array

Main changes:
RemoveAt, InsertAt - Private API.
Capacity - It can now shrink and enlarge - however there is no public API to enlarge.

Most internals re-factored to use RemoveAt, InsertAt - avoids a lot
of duplication and ensures proper clean-up when objects were being removed.

Fix issue 13128.
I don't like this change capacity/length swap. It breaks all bounds checking pretty much everywhere in `Array`. There are no explicit asserts because all the code is relying on the implicit checks. I believe this can be reverted without changing the "heart" of your revamp?

Also, `back` (`return _data._payload[$ - 1];`) and most `opSliceXXX` (`_data._payload[] = value;`) are now wrong, since they relied on the `_payload` representing the actual useful data.

And I think that's a reasonable assumption, and a sane model.