reducer: Iterate over (define)s in right order

AnalyseExprs walks over top-level (define)s in reverse order and then
builds constantTopLevelBindings in the same order. This means the result
is reversed versus the define order in the program.

When ReduceExprs folds over the defines backwards it will have no useful
known values as it will only know about definitions *after* the current
define. This makes our single-pass reducer less effective than the
previous version.

Fix by building constantTopLevelBindings in "reverse" order while
iterating over the definitions backwards. This means the result is in
the expected program order.
compiler: Add et.Expr.schemeType

This is a very rough estimation of the type of an expression. This is
used to allow the reducer to verify that type constaints match for
things like variable references and lambda expressions. Previously they
were always considered to have AnySchemeType which negatively impacted
inlining and binding dropping.
compiler: Introduce RetypeLambdaArgs

RetypeLambdaArgs is a replacement for RefineArgumentTypes. While Refine
inspected the plan steps to deduce types, Retype inspects the reduced
lambda expression using the live intermediate values to determine the
signature of called procedures. This means that Retype works well with
the new Scheme type system as it still has access to the full Scheme
types of the casting expressions while the steps only know about cell
types.

- Introduce RetypeLambdaArgs which inspects the reduced expression of a
  lambda to determine argument types. Rename the RefineArgumentTypes
  test to RetypeLambdaArgs and add a few more test cases to cover

- Have PlanLambda call RetypeLambdaArgs early to rewrite its argument
  types

- Rename the world pointer logic from RefineArgumentTypes to new
  WorldPtrUsedBySteps and use that to drop the world pointer after
  function planning as before

- Remove CastCellToSubtypeChecked and the code in CellValue that went
  out its way to generate it instead of using GenTypeCheck.

- Remove CellType.genTypeCheck. This is no longer usedd
compiler: Clean up PlanTypeCheck's IR

- Instead of allowing arbitrary IR in the success/failure block of
  PlanTypeCheck just return a predicate temp. This allows simple type
  checks like testing an cell type to be accomplished without the
  use of phi nodes.

- The generated code for AssertPredicate had the true/false branch
  labels switched which made for confusing reading