adding ProducerConsumer Iterator

This adds a utility for calling foreach on an iterator without forcing the iterator. It uses a fixed size thread pool and offers utilities for per-task timeouts and a timeout for the overall job. I have used this a bunch this week and found it useful. Note that this is not the BufferedMappedIterator, which I have also written, but will make as a separate pull request after more testing.