DispatchQueueWrapper was broken out to its own file

Accounting of waiting blocks was integrated into DispatchQueueWrapper.
Any performance penalty for doing so seems negligible, while the separation of tasks is a lot clearer (and the noise lower.)