compiler: Add planner for some predicates

This will try to plan the predicate based on the intermediate value's
possible types. If that fails it will generate a cell type test.

This expands the tests for the implemented predicates to explicitly
verify they can function on datum cells.
Implement (scheme lazy)

This is a nearly direct copy of the example implementation in R7RS. This
required fixing ReduceApplication to deal with recursive procedure
arguments.

Unfortunately one of the R7RS examples does not work due to our
mis-implementation of top level defines. This will be fixed in a later
commit.