compiler: Static planning for (cons) and (append)

The primary motivation behind this is to allow optimised planning of
(apply) in more situations.

When performing tail calls to procedures with rest arguments (apply)
might be needed to pass the rest argument. Our fallback (apply) path in
the stdlib doesn't guarantee tail recursion so it needs to be avoided
whenever possible.
compiler: Better planning for double equivalence

Normally (eqv?) on flonums can't be trivially planned because in Llambda
(eqv? +nan.0 +nan.0) is true. There is no LLVM condition that
corresponds to that test. However, if one of the flonum values is known
then we can either compare the float values or check for NaN

This adds a new ps.FloatIsNaN step that checks if a floating point value
is NaN. This works by checking if the value is not equal to itself which
is only tue for NaN.
compiler: Support fraction literals

This isn't terribly useful as we only support floating point numbers.
However, they're required by R7RS and could conceivably be used as
useful shorthand for certain constants
stdlib: Fix (rational?)

Infinite and NaN values are not rational. Add some tests to ensure this
continues to work in the future.
stdlib: Add (square) and (sqrt)

(square) is simply defined as (* n n) while (sqrt) uses the C standard
library.