Add a missing write barrier in OS settypecache.

If the result of MVM_repr_at_pos_o() is in the nursery, then a write
barrier is needed to ensure that the STable whose cache is being set
becomes correctly marked as a nursery root, and hence Object addresses
in the cache get updated.
Missing write barrier in setwho.
Missing write barrier in setboolspec.
Missing write barriers in invo-spec deserialize.
A few missing P6opaque REPR data write barriers.
Should not use REPR() on an STable.

The code was buggily assuming that every collectable was an Object when
checking to see if Objects referenced frames. Not all collectables are
Objects, but by chance of how Objects and STables are laid out in memory,
REPR() on an STable would give a pointer to a sufficienty valid Object
that the code didn't fail. However, a side effect of this was the code
ends up thinking that every STable is an Object that references frames,
and hence need to be tracked in gen2roots[]. This slows things down, and
concealed several bugs, fixed in previous commits.
In form_string_heap(), ensure that the padding bytes are initialised.

Whilst we never read this memory, it's useful to ensure it is initialised,
otherwise valgrind (and similar tools) will rightly complain that we're
writing garbage to disk.

With this change, compiling the setting runs without error under valgrind.
In process_worklist(), assert() that various assignments are unneeded.

Also assert that if the pointer is in to-space already, it is never marked as
gen2.
Re-order code in process_worklist() to avoid checking tospace for gen2 items.

Still run the sanity test for tospace even on items marked as gen2.
Mark gen2 as live using a flag bit instead of the forwarding pointer.

This means that the forwarding pointer is now only used on dead objects.
Use a flag to indicate which items in fromspace are live (during GC).
Some GC marking sanity check asserts.
Encapsulate SC access through MVM_sc_{get,set}_{stable,obj}_sc()

Ideally these would be inline functions.
Assert that no SC accesses happen on objects mid-GC.
Move struct MVMCollectable's MVMSerializationContext pointer into a union.
Add a MVMSTable member to the union to hold the chain of STables to free.

Previously these were stored in the forwarding pointer, which necessitated
casts.
Move the forwarder to the union.

This shrinks every Object and STable by 8 bytes on systems with 64 bit pointers,
and 8 bytes on systems with 32 bit pointers that require 64 bit alignment.
Define NDEBUG in optimized builds.

Means that we will not check assert()s introduced in recent commits in
optimized builds.
Rename a flag for consistency.