rewrote argument handling

Previously, the argument handling was based on a literal interpretation
of the spec's description of 0x1b - namely, that its behavior varied
depending on whether it was in a or b. After reading the spec more closely
(especially in areas surrounding comparison and special operations), as well
as comparing the behavior of other emulators, I decided to switch to a model
based on separate read and write operations.

Instruction and argument parsing was also moved, so that instead of working
with bits in the instruction loop directly, instructions and arguments are
parsed into a data structure. (This is a simple struct of roughly 10 bytes.)
restructured emulator code

The code responsible for executing instructions has been split into its
own function, dcoy_dcpu_exec, and its own file, dcoy/dcpu/exec.c. The
dcoy_dcpu_step function now just reads an instruction, adjusts PC, and then
hands it off to dcoy_dcpu_exec.

A couple of function names have changed, and the error system was replaced.
Instead of a single error message, errors now have a code, a message, some
associated data, and a record of the PC where it occurred.