lowlevel-z80-thunked: Fix pre-emption crashes
This changes the way things work between the stubs and core code as they were
broken.
The stubs are now responsible for saving all the register state on the user
stack. The istack cannot be used for this as it was before because it may be
blown away by another interrupt. Instead the stubs carefully shuffle the two
bytes of return address onto the kstack of the process and return on that stack
in the pre-emption case.
It's not pretty but it's hard to do anything more elegant, and speedwise it's
a fast way to handle it.
A 'You are not expected to understand this code' moment, but it's buried in
support assembly code that nobody else has to understand.