This change implement's a change, suggested by @cbiffle, that a) aligns RAM on a 128KiB boundary, and b) turns the PC from a pointer in the VM (treated as an index in the host) to a host pointer. This lets you use auto-increment mode to advance the PC, and fast bit-field-clear instructions to wrap.
This based on my earlier change, which does a branch directly to the assembly entry point instead of treating it like a C-abi function, and that also makes the jump table entirely internal to assembly code (and invisible from Rust). Note that this frees up an argument register, so you could pass all of the required data into asm using the C ABI, but there's really no need.
Whereas the earlier change is indistinguishable from the original performance-wise, the result here is slightly slower than the original; possibly because of the need to handle negative offsets, which means some extra instructions to handle wrapping around from the bottom of RAM, and because of the need to convert to and from VM pointers and host pointers in some instructions.
On balance, I don't think this change is worth it, at least not without making fairly invasive changes to the way the stack is used, but I thought I'd send it along for reference anyway.