use todo stack when traversing GC heap

- collect all live objects in a todo stack
  to be marked later

- remove outer anychanges loop and scan GCBits

- only mark todo items after current mark(p1, p2) is done
  to benefit from cache locality, prefetcher and tail recursion