runtime: Introduce (define-slice-proc)

This is an internal helper to defining procedures operating on slices of
a value and converts (vector->list) and (vector-copy) to use it. This
new marcro also properly types the case-lambda arguments which was
missing in the previous procedures.
runtime: Add assertSliceValid

This is a helper function for the stdlib that will assert a
user-provided slice will fit inside an object. If it doesn't an error is
signalled including the sliced object and the passed indicies.

This converts lliby_vector_to_list and lliby_vector_copy to use the new
function.
runtime: Clean up StringCell::unicodeChars

This was originally implemented before strings had a known character
length. As the length was unknown special logic was required to detect
reading past the end of the string and dealing with end == -1 meaning
end of string.

This uses the character length of the string to clean up the logic and
allow us to fail early in more cases.
stdlib: Test more vector slice boundary conditions

Ensure we test empty slices at the beginning and end of a vector. This
should help catch off-by-one errors.
stdlib: Implement (string->list)

This is built on top of the recently introduced slice infrastructure and
StringCell::unicodeChars()
compiler: Don't pass state in NumberProcPlanner

The PlannerState is unused in any of the NumberProcPlanner helper
functions. Remove it.
runtime: Remove madvise() when GC debugging

This was used to free memory from previously used allocations while
keeping the address space reserved. However, it causes the GC debugging
to run more than 4 times slower for allocation heavy programs on Mac OS
X. Remove the madvise() to trade memory usage for speed.
Add sample programs as functional tests

This adds a SampleProgramSuite which contains sample programs from
Rosetta Code. These aren't testing particular language features but
ensure that real Scheme snippets run correctly.