compiler: Properly handle macros as inner defines

When parsing define data we weren't expanding macros. This means we
would abort early when collecting definitions and consider the macro the
start of the body. When we try to treat it as an expression and expand
the macro it would then fail as define processing was already complete.
compiler: Get rid of unused BindingExpr class

This isn't used anywhere. This could be restrictive once we support
multiple value defines.
runtime: Implement (rationalize)

This is a pretty dumb algorithm. It depends on the fact that flonums can
only exactly represent fractions with powers of two as the denominator.
It reuses the (numerator)/(denominator) infrastructure to split the
number. It then repeatedly divides the numerator and denominator by two
while tracking the last candidate that passed the error check.
runtime: Use __builtin_ctzll to fix 32bit

inexactFraction was using __builtin_ctzl to count trailing zeros of a
std::int64_t. This works fine on 64bit where long == std::int64_t but on
32bit it doesn't work. Switch to using __builtin_ctzll which should work
on both platforms.
runtime: Fix (string-map) crash on x86-32

Apparently in the x86-32 ABI returning a class/struct with a single
member is not the same as returning the member type. This caused a crash
(string-map) when it tried to invoke the mapping function with the wrong
signature.

Instead introduce UnicodeChar::CodePoint as an alias for std::int32_t
and define the mapper function to return that.
compiler: Properly enable LLVM tail call opt

We were only passing -tailcallopt when we were saving intermediates. The
normal compiler path was missing the argument completely. This makes a
difference on x86-32 where certain tail call optimisations aren't
performed without that option.