Instruction decoder

Factor out the instruction decoding logic into its own class to make it easier for the disassembler to reuse it.

Also makes the disassembler output nicer by displaying offsets as signed, and adds support for [reg - int].