Factor out allocate_preferred().
Do not access size_ unless necessary.

Support shrinking move as well.
Use a cheaper allocation helper for ctors.