Do a reinterpret_cast instead of transmute in object::cast

No perceived difference, but transmute has scarier semantics.
Make sure EventLoop::run acquires the context

There was a race condition in grustna_main_loop_run_thread_local()
where g_main_context_push_thread_local would fail an assertion
due to another thread having acquired the context for a call.

Resolving it meant that EventLoop can no longer adopt a
pre-existing thread local context, because we want to be able
to reliably unblock the pre-acquire wait from the call logic,
and that may not work if the context is driven by
some other library.
Various test suite improvements

Factored out the spawn_with_future function. It may be handy
for some tests to wait on a task result.
Renamed some tests to better correspond to their subject matter:
we are not necessarily hitting the off-stack path in all cross-task
tests.
Bring off_task_as_interface to what it was supposed to do.
Sundry stylistic touches.