Add list metrics for constant proper lists

This encodes the length and type of the list inside the pair cells for
constant lists and changes the runtime to check those fields when
creating a ProperList. This allows skipping a list scan for certain
operations and makes finding the length of a constant list O(1). The
downside is a slight slowdown for non-proper lists due to the extra
tests.
codegen: Properly phi non-results across branches

A condition's result was properly being phi'ed but any live temps
weren't. This means that if GC occurred in one of the branches the stale
value from before the branch would be used instead.

This resulted in unit test crashes with optimization disabled. However,
it's easily triggerable with -O 2 as the new functional test shows.