Fix (list-copy) for non-lists and simplify

After (list-copy) was updated to handle improper lists its logic became
pretty convoluted. It also didn't correctly handle non-list objects as
per R7RS. Simplify the logic, handle non-lists and add a unit test.
Create GC slots on demand

Instead of creating a GC slot for every possible GC managed value only
create a slot when a value needs to be restored across a barrier. This
allows us to significantly reduce the number of slots required. We also
know the type of the value so we can remove the casts to/from %datum*.
Immediately dispose of unused arguments

If the arguments aren't disposed they'll be saved and restored across
every GC barrier in the function. Usually unused arguments indicate
dubious code but it's possible macro expansion coudl create them.
Mark new cells as GC allocated

This gets rid of the old white/black designation inherited from Llispy
and instead uses constant/allocated/forwarding. This is to support a
more simple semi-space GC as opposed to Llispy's intended mark-sweep GC.
Remove preallocCells

preallocCells() is a legacy for when only single cell allocations were
supported. The intent was to preallocate the number of required cells to
reduce GC overhead. Now that ranges can be directly allocated from the
GC it no longer has a usecase.
Switch create(Proper)?List use std::vector

Previously they were accepting std::list<> probably due to my Qt brain
damage. std::vector<> is more efficient here but more importantly the
vector can be easily GC rooted across the GC allocation for the list's
pairs.
Rename alloc::Cell to alloc::AllocCell

"Cell" is an ambiguous name and could imply a generalization of
DatumCell. Tename to AllocCell even though its in the alloc namespace to
clarify that is it allocator related