implement div_by_zero and illegal_insn exceptions
move conditional branch calculation to decode stage

When this caclulation is in execute stage, there is a long
critical path running through the adder, back to the pc generation
in address stage.
make sure writes are prevented on flush

This fixes a bug where writes from the instruction in memory
stage when an excpeption occurs would go through.