Bug 1030393 - Use concurrent.futures for managing threads/processes;r=davehunt

Our previous use of multiprocessing pools had problems: we weren't cleaning up
correctly after things were finished, leaving us with zombie processes. It's
easier to avoid these pitfalls with concurrent.futures.