syscalls: fix return address calcuations for x86 and ARM

Old ARM return address was the address that the syscall-calling function was
returning to, so the return code may have been wrong, and buffers may have
changed before the return point detector was triggered. We now correctly
detect that the instruction after swi is about to run.

x86 code could be simplified to pc+2, but we actually check to make sure it's
a syscall or sysenter, and pull the return address out of the registers. The
ABI specifies that the user code has to put it in a register before the
syscall or sysenter instruction, so we can count on it being there already.