Removed separate ArrayBuffer for ROMs

- Simplifies memory calculations, as there is no buffer offset to consider
Factored out memory management into MemoryAllocator class to allow easier control

- Allows ArrayBuffer to be reused when running tests, to avoid running out of host native memory
Fixed legacy CPU.halt() patch to ensure calling new CPU.halt() method always calls the legacy one
Fixed issues with test suite

- Out of memory errors (Node.js) and tab crashes (Chrome) were caused by memory leak
- Many instances of objects created for tests (for isolation) - exhausted heap memory
- Updated tests to call system.pause() after each test and cpu.halt() to then clear the yield timeout so memory is freed
- Updated FDC, PS2 and VGA I/O devices to use system-managed timers for better accuracy and to allow memory to be freed