daemon threads skip cleanup at interpreter shutdown and don't play well with subinterpreters trio should maintain two pools of threads, daemonic and non-daemonic so trio can push that choice onto users eg: `trio.to_thread.run_sync(fn, daemon=False)`