Add TempValue.isGcManaged and ps.DisposeValue

TempValue.isGcManaged indicates if a value should be a GC root. All temp
values storing cell values will be annotated as GC roots.

ps.DisposeValue instructs codegen that a value will not be used again.
This eventually can be used to un-GC root values.
GC safe code generation across function calls

This is untested against and actual GC but it doesn't cause any
regressions on unit tests. Cell allocations are the other GC barrier and
are currently unhandled.
GC barrier support for cell allocations

This generalizes the GenGcBarrier logic and updates GenCellAllocation to
use it to save/restore GC roots in the garbage collecting path.
Add DisposeValues conniver pass

This disposes of unused values as soon as possible. This greatly reduces
the overhead of GC as only truly live values need to be rooted.

This changes ps.Invoke to take an InvokeArgument which indicates if the
TempValue should be disposed after the invoke. Disposing before the
invoke would make the argument inaccessible and disposing after would
mean it would be rooted for the duration of the call. The only way to
avoid rooting one-off argument values it to dispose them as part of the
invoke.