Add virtual memory allocation algorithm to MT-TBS

This is needed when using traces collected with potentially conflicting
addresses to ensure there is no conflicts.

It works by allocating a range of pages to each process and then putting
those pages in a free list. As the process uses new pages, the free list
is used until it is exhausted, then more pages are requested.

When the overall physical memory address space runs out of memory, then
we just kill execution with an out of memory error.