Blocking convenience wrapper around execute for non-async callers.
Spins up a fresh current-thread Tokio runtime on a dedicated thread, so it is
safe to call from synchronous code even when an outer runtime exists. Async
callers should use execute directly.