sched: handle R_RECV in return_from_exn()

This shouldn't be necessary if the preempting thread is waiting closed for the
current thread, because an active send will roll right over a R_RECV anyway.
In fact, that case should be caught in might_preempt().

This changeset fixes the inter-space IDL benchmark, which would otherwise see
R_RECV preemption turning into an omitted receive phase and therefore errors &
failures.
sched: don't let a closed waiting thread pre-empt its waitee

That causes an extra spin through the scheduler and possibly a loss of a later
preemption.
sched: fix warning about NORETURN switch_thread_u2u() returning

The new NOT_REACHED macro should be used in place of assert(false) in all
spots where returning from a potentially nonlocal-exiting function is
unexpected. It differs from assert(false) by retaining its NORETURN attribute
even under NDEBUG.
micro-optimize ksystemclock(), read_global_timer()

Clearly cli/sti pairs don't make a great difference in the benchmark.