This enforces the send bound, then uses an async task looping on a channel to run callbacks on the main thread.