VM: move package loading functions into new class, PackageLoader
VM: restrict allocation to when it is known to be safe

- Allocation may trigger garbage collection, so we should only perform
  allocation when we know the stack is in a state where it can be
  scanned.
- Functions have stack pointer maps for certain pc offsets (allocation
  points and function calls). So we generally need to check that we
  are at one of these points before enabling allocation.
VM: handlify creation of StackPointerMaps
VM: reimplement block printing using std::ostream
VM: Support for a simple mark-sweep garbage collector

Also deleted RememberedSet. It will be used (much) later for a
compacting collector. It probably doesn't satisfy whatever the future
requirements are, so just get rid of it for now.
compiler: fix bug when capturing `this`