Added AsyncListener. Still single-threaded, but the semantics is right.