Support exact (/)

If exact integers that divide in to each other without a remainder are
passed to (/) we should return an exact result. For example, the
following should be true:

(eq? 5 (/ 20 10 2))

Previously we were always returning an inexact value for (/) which isn't
ideal from a consistency or Scheme compatibility perspective.

This is slower as the result type of (/) between two dynamic integers is
unknown and requires a library call to calculate.  However, performance
sensitive code should be using explicit number types.
stdlib: Support for named let and let:

For some reason named let wasn't possible when (let) was first
implemented even though it appears in the R7RS example macro
implementation. This is used quite frequently in idiomatic Scheme code.

Import the definition and test from R7RS. Add an analogous clause to
(let:) to supported typed named let.

This also adds a patience sorting sample program that uses named let.
stdlib: Implement (vector-fill!)

Unfortunately this cannot use (define-slice-proc) on the Scheme side as
the fill appears between the vector and the slice indices
stdlib: Implement floor division

This is performed as truncating division followed by a fixup step for
negative quotients with remainders. This has no planner support;
truncating division should be used where performance is important.
Split out arithmetic implementation

NumberProcPlanner.scala in the compiler and number.cpp in the runtime
were reaching an unwieldy size. Separate out the pure arithmetic
operations to ArithmeticProcPlanner.scala and arithmetic.cpp while
leaving the comparison etc. operations in the original files.

This also creates an inexact.cpp for the (finite?) and (infinite?)
implementation. This reflects the fact they're placed in a different
Scheme library from the other runtime functions.