Introduce dynamic heap management

* heapSize doubles every time we are running out of space after a GC
  or allocated a too big chunk (>= 10%) outside of the _baseBlock.
* allocations when the heap is too filled are done with regular malloc,
  and promptly freed after as we request a GC.
* improves the memory footprint and does not increase execution time.
* --min-memory and --max-memory are respected.
* allow to run 2 gc consecutively. This happens when we need to change
  the heap size. As the only reliable measurement is the activeMemory,
  which is only available after a GC, and we need to do another GC
  to transfer the heap to the bigger block.