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.
Seems like a redundant check to me, if the public `capacity` already checks that this is bigger than the current cap. If you want a function that clears the allocated data, might as well just have a function called clear and call it directly.