compiler: Properly locate exceptions with (apply)

If the cast to a procedure fails at compile time we need to properly
locate the exception on the operand
compiler: Planning for integer +, - and *

This has two advantages over calling the stdlib:

- Integer instructions are obviously much cheaper than a GC barrier +
  function calll

- The result is of "exact integer" type instead of the more general
  "numeric" which allows further type-based optimisations downstream.

This improves the performance of R7RS's life example at -O 2 with a
debug runtime build
compiler: Add planner for (list)

This uses BuildProperList to directly build a proper list instead of
depending on the application code to build it and have lliby_list
immediately return it.
compiler: Implement inline (length)

If a value is known to be a proper list we can more efficiently
calculate the length ourselves inline than taking a GC barrier to call
(list). The IR output is fairly verbose but that's mostly due to casting
- the generated code should be quite compact
stdlib: Fix typo in test name

byyevector => bytevector
compiler: Pop shadow stack before signalling error

If GC happens at the right time during exception handling it may try to
walk the old stack which is both deallocated and not guaranteed to be in
a consistent state. This wasn't reproducible for me as the next function
exit will reset the shadow stack. However, add a fairly complex
functional test anyway that might catch something similar in the future.