Reduce threading

#743 #677 
sounds like this was the one that needed to go if we were executing every callback on a different thread, that was probably a lot of them.

Does python have default `ThreadPool` or `ExecutorService` implementations?

It's probably not bad to have these callbacks running on threads if we can reuse a fixed number of threads and put the rest of the callbacks on a queue if they happen to be too many.