The `swap!` implementation calls invoke and eval, and therefore require
backporting the implementation of invoke for MalUserFn and MalNativeFn
from step9 all the way back to step6.
- Moved some stuff out of printer into str,
to support throwing strings in types.fs
- Fixed an apparently completely broken 'nth'
- Still failing 120 step9 tests