MemorySection should have a virtual destructor
Allow MemorySection to manage a length granularity

This helps when multiple sections are intended to appear contiguous to
the running process.  For example, specifying a 64K length granularity
prevents unusable address space holes from appearing, as the next
available address will be properly aligned.  By default, the class will
use the system page size for this adjustment.
Allocate ElfImage section using a 64K length granularity

Also changes the initial program break address to be at the next
available page rather than aligned up to 64K for a new allocation and
wasting space.  Process object will need to be adjusted to take
advantage of this as well.
New Process program break implementation based on sections instead of regions

Also adds a guard page at the initial break address, which serves not
only to prevent the process from underrunning its heap, it prevents a
need to keep track of and compare against the initial program break
address