Use GCData pointer instead of reference

This is needed because we want to manage this outside the stack later
for concurrent GC. In that case we need to store the GCData on the heap
so the concurrent thread can use it.

Therefore we replace this in advance, so the change for concurrent GC
can be smaller.
Pass down STATE into collect_young and collect_mature

For concurrent GC we want to have access to it to start the marker
thread. Also updates the VM tests and fixes some test cases to really
test something properly.
Move definition of mark_ down for better compaction
Use existing timers instead of an additional custom one

We already have timers for the collection time duration, so we might as
well use those instead of keeping time manually here.
Remove unused stats instrumentation