First migration step towards a nano-pass approach.

Attempting to do too much in a single pass resulted in a dead-end.  Everything
worked great until two problems happened:

1) I was unable to properly support forward references to labels, and,

2) I realized I would have needed six or seven different kinds of relocation
records to properly support the RISC-V instruction stream.

Therefore, I'm going to migrate the assembler to a nano-pass design, where
individual passes do one, and only one, transformation on the source listing.
Additionally, I'm strongly considering deferring final binary layout to a
loader program.  A linker would be used to transform multiple assembler object
files into a single file, but still not quite in machine-executable form.
(Again, otherwise, we'll need 7 relocation record types for each kind of
relocation.) The loader, then, is responsible for translating an object file
into a machine-executable form.  This is how the Go compiler suite works.