Tightens the data flow between the CPU and UI threads
to resolve multiple race conditions, such as:
1. Unbinding a debug interface update CB while it's in use,
causing a possible use-after-free.
2. Binding breakpoints via the disassembly widget that would read
a stale local variable, and bind the breakpoint to a bogus address
+ probably more subtle races that are now resolved