Changed to use sync controllers.  I still had to crank the event loop once before calling close() on the stream controllers, or else some events are not sent, not sure why.