Add memory protection for young GC space

Using mprotect we can guard the memory spaces that shouldn't be used
during normal runtime by the mutator threads. By guarding this with
mprotect, we make sure that if we even do this, we crash immediately so
the problem is a lot easier to debug.
Allow JIT to run GC dependent

This also makes sure that when we fork, we stop at a safe point to do
this. Otherwise we might fork in the middle of generating JIT code,
putting LLVM in a state that can cause problems, for example if it holds
locks internally.