This is not a borrow checker issue, if I understood correctly. You are using Rust callbacks, the same you are using JavaScript ones. The problem is that you are not accepting a generic callback in "on_speak" but a particular type that you define: fn(SpeakEvt). If you try to capture variables inside your callback, you should use define an FnOnce type.
But this is just the start of your problems. To use Async, your Fn type should now also return a Future since these async tags will infect all your functions and their returns.
tl;dr: I'll start over and use Channels.