An upcoming change makes the timeout handling rather more fiddly.
Rather than have a huge pile of code to make it all work, encode the
timeout behaviour as explicit instructions to a simple virtual machine.
The instructions are assembled using preprocessor hacking.