runtime: ProperList refactor

- Instead of having ProperList be a separate object that wraps a list
  head have it simply derive from ListElementCell. This allows it to be
  used to mark up proper lists that are being passed in from Scheme via
  a typed parameter.

  This allows it to replace the functionality of RestArgument at the
  same time.

- Rename isEmpty() and length() to empty() and size() to better match
  STL conventions.

- Don't calculate the list's length during construction time. Instead,
  have size() check for a length hint and if not use std::distance() to
  calculate the distance between our two iterators.

- Add ::isInstance() to determine if a cell is the head of a proper list
  of given type. This iterates though the pairs in the cell and verified
  each car is of the specified type. This allows cell_cast<> and
  cell_unchecked_cast<> to work transparently to cast to ProperLists

- Move ListElementCell::createProperList() to ProperList::create(). This
  becomes a template function which allows it to ensure the incoming
  vector has the same cell type as the generated proper list.

- Don't include ::isValid(). All ProperList instances should be the head
  of a valid proper list by definition. If this cannot be statically
  determined then cell_cast<> should be used

- Annotate much of the runtime with ProperList<> types instead of
  ListElementCell. This also serves as documentation of where proper
  lists are expected.
stdlib: Fix missing GC root in (make-list)

(make-list) didn't GC root its fill value before allocating the new list
elements. This means that the fill value could be invalidated in a
garbage collection occurs.

Fix and add a functional test.