runtime: Fix GC segment size calculation

- When GC debugging in enabled instead of setting m_allocNext to
  m_allocEnd set m_allocEnd to just after the reserved allocation. This
  means our segment terminator is placed immediately after the
  allocation instead at the very end of the segment.  Due to pure luck
  iterating over an entire segment of zeros didn't cause the finalizer
  to crash

- Make sure our segment terminator is aligned to a cell boundary.
  Because 4096 - sizeof(SegmentTerminatorCell) happened to be AllocCell
  aligned on 64bit this didn't crash. However, 32bit builds weren't as
  lucky.
runtime: Validate garbage state on collection

32bit builds are corrupting cell garbage states due to misaligned cell
allocations. Try to catch this explicitly in debug builds.
compiler: Fix the size of cells at 24 bytes

%cell was defined as %pair which is the wrong size for 32bit builds.
Explictly fix the size at 24 bytes as the runtime does. This fixes
corruption due to misaligned cell allocations on 32bit builds.