testbench: add µIDL support

Partially anyway. Much of the IDL support code that'd naturally belong in µIDL
is instead in the µiX tree, still.
testbench: ipc: add test case for recv timeout after send

This uses µIDL for the helper thread's IPC interaction, making it quite nice
to both read and write.
remove ipc_simple()

Too simple. So simple as to only have that one call site.
testbench: ipc: add test for send-half preemption

Occurs in receiveless IPC, and two-phase IPC where the subsequent receive-half
would otherwise be immediately satisfied by a passive send. This test applies
only to the former case.
ipc: set wakeup_time on transition to R_RECV

This becomes relevant when ipc_send_half() starts popping pre-emptions;
otherwise the scheduler will timeout the R_RECV, causing sigma0 to enter
send-to-send IPC deadlock with its pager. (which should properly use reply
semantics, but doesn't.)
kmain: use ReplyWait kIPC in sigma0's pager

This was a longstanding bug that didn't come up until waiting to send turned
into an IPC deadlock.
ipc: implement send-phase preemption

This changeset completely ignores sens_prio, and therefore preemption delaying
and signaling. That should be simple enough to implement (but complicated to
test); it goes in the preempt return part of sys_ipc().

Secondary changes:
  - ipc_user() can now put @from in R_READY too; callsites were updated
  - ipc_send_half() was made static within ipc.c
  - btos() was added to <ukernel/util.h>, copypasta'ing the one in testbench
testbench: ipc: add priority difference to recv_timeout_from_send

The parameter is named p_preempt but nothing in the test shows that it
actually causes pre-emption (though in mung it does). Perhaps one day this
test will be amended to count the number of pre-emptions using a custom
exception handler.