add support for moving huge allocations via mremap

This leverages MREMAP_RETAIN to move huge allocations without leaving
gaps in the address space. The source is not purged since it is already
zeroed lazily if necessary.