compiler: Support trivial inlining

Generalise the self-executing lambda code to allow inlining other
procedures. If the lambda isn't self-executing we are extremely
conservative about inlining. The inlined lambda must either evaluate to:

- A single leaf datum (i.e. not a vector or pair)

- A single application of another procedure that only takes leaf data,
  variables already bound at the time of the original application or the
  original application's arguments

This may be loosened later if obviously beneficial inlining
opportunities are found to be missed.
compiler: Basic support for inlining with rest arg

This only works if some simple operations (pair?, null? or length) are
applied to the rest arg or the reduced lambda body doesn't reference the
rest arg at all. This is the initial step to inlining (case-lambda).

This is implemented by introducing yet another abstract tree called a
PartialValue. PartialValues are similar to an expression tree except the
structure of an expression (pairs and vectors) can be known without the
contents of the structure being resolved to a literal. This allows
operations like (length) on a list where not all the members are
literals. This will also allow for re-applying a rest arg using (apply)
compiler: Inlining improvements

Ths end result in (case-lambda) is inlined properly in most cases. This
is the final goal of the current round of inliner work

- Don't prematurely reduce the applied expression in ReduceApplication.
  Ironically, reduced expressions are harder to statically evaluate due
  to their use of et.Begin() instead of et.Lambda()

- Add a report procedure reducer for (apply). This builds on the
  PartialPair and allows re-apply a rest argument to a new lambda as
  used by (case-lambda). This will also generally flatten lambdas that
  use (apply) to self-execute for whatever reason

- Allow et.Begin() to be considered for inlining as long as it's only
  binding trivial expressions
runtime: Fix memory leak in (write)

(write) was leaking at least 8 bytes on every invocation
runtime: Implement (display)

This is required for the example program in R7RS

- Split out the UTF-8 code from StringCell in to unicode/utf8.h. This
  has the additional benefit of cleaning up StringCell by grouping the
  UTF-8 functionality separately

- Add DisplayDatumWriter as a subclass of ExternalFormDatumWriter with
  the appropriate virtual function overrides

- Add unit tests to both the runtime and functional tests