~tim/scheme-vm

scheme-vm/spec d---------
Use dot to separate library name parts
Fix the map function so it handles multiple list args

This work exposed a serious flaw in my approach to the compiler. Up
until now I could get away with fundamentals like `car`, `cdr`, etc.
being macros, compiled directly into vm instructions. But that's not
right; these can be passed around like lambdas in Scheme, so I need to
rethink my approach.

The dirty hack I used here is to wrap the macro in a lambda, but that is
SLOW! The test suite now takes nearly twice as long to run.
Fix bug defining bindings in a libary
Extract file loading from Compiler
Some small fixes to loading/including libraries
Refactor for easier porting/debugging

* Remove code paths that allow parsing/compiling/executing *additional* code
  subsequent to initializing the object.
* Remove caching of standard library in specs to feel the full pain of slow
  parsing/compiling.
* Move parsing of code responsibility back up to the Program object --
  Compiler delegates back up to the parent Program if it needs to parse
  new code. This separation of concerns could be further improved.
Refactor error printing
Show better error when calling something other than a lambda
Add more char functions
Add case insensitive char comparision functions
Improve lib spec failure message
Support all character names in the spec
Add string->symbol function
Add symbol->string and symbol=? functions
Allow comparing more than 2 strings with string=?
Get rid of unneeded keep_last option

`keep_last: true` was only being used by specs, and `(exit)`
already accomplishes the same effect, leaving the stack intact for
inspection.
Fix error when it's on line 1
Show better message on syntax error
Fix parser bug

(foo)(bar) could not be parsed
Store line and column number for better errors
Next