Follow-up to the off-turn flush worker, found while running the runtime tests:
- The worker was a bare threading.Thread, so the export it runs lost the
contextvars of the turn that scheduled it. _send_exported_packages reads the
profile's send/consent config through them, so under a multi-profile serve the
export resolved the launch profile's config instead of the finishing turn's.
Start it through spawn_context_thread.
- A trigger arriving after the worker saw "nothing pending" but before the
thread finished dying found is_alive() true, set the pending flag and started
no worker, so that flush waited for the next trigger. The worker now clears
its slot under the lock schedulers check, and the slot is set only after
start() succeeds.