Much faster than dealing with the line and column as we go. In the
vast majority of cases this data is completely unnecessary, so this is
wasted effort. At the point where we need accurate line/column
information, we can compute it - in an error state, it really doesn't
matter that we're spending that extra time to compute it.
I've made prototypes for them, put at the top, and moved their
implementations to the bottom. They're not exposed to anything
outside this code unit. Now, when reading the code, the parsing
routines (which are the main reason to be here) are at the top and
clear to read.
We now have a primitive and not fully tested parser for strings and
symbol sequences. We record the lines and columns of each object on
the object for better compile time error handling.
I've also structured the code base in a slightly weirder fashion,
which makes my includes look nicer. I've split up stuff quite a bit
to ensure code units are bit more focused.