add a version of rallocx taking old and used sizes

Using sized deallocation makes deallocating the small size classes ~10%
faster and the used size avoids copying unused space at the end. This
function is intended for widely used data structure implementations
where performance far outweighs the need for a convenient API.

The caller can set the used_size parameter to old_size if there isn't a
more specific value. It can be assumed that a caller aware of used size
will also have the old size, because in reasonable code they will either
be equal or tracked as length (used) and capacity (old).

The used size is especially useful for vector / string concatenation. A
good implementation will reserve space using a geometric growth pattern
to amortize the cost in a loop. An individual concatenation will often
require too much space to reused the unused space, despite it being up
to almost 50% of the vector capacity.

Closes #101