compiler: Don't treat vt.Predicate as an integer

vt.Predicate is intended to represent boolean values returned from LLVM
tests. However, it was treated as an integer which means it would
convert freely to and from Scheme exact integers.

This had no obvious affect as vt.Predicate is not accessible as an NFI
type and its usages internally are fairly restricted. However, it could
be a source of errors in the future.

Introduce a new vt.BoolLikeType which covers both vt.Predicate and
vt.CBool. Teach TempValueToIntermediate about iv.NativePredicateValue so
it can properly create predicates from temp values
compiler: Remove unused toRecordTempValue

This code is no longer used after the type system refactor
compiler: Make the reducer work in nearly one pass

Previously top level defines were reducued in a random order in a
reducer config without any known values. This means that every time a
top-level definition referenced another top-level definition it would be
re-evaluated. Then, the top-level defines would be reduced a second time
when its passed through ReduceExpr.

Switch to working like the planner does - evaluate the top-level
bindings in order and update the reducer config as we progress. This
works well as it's not possible for a top-level definition to refer to a
value that hasn't been defined yet. Secondly, check for existing known
values when reducing et.TopLevelDefine in ReduceExpr.

This is more efficient and removes some not particularily pretty code.
However, it's mostly required for the retyper rewrite in the following
commits.