Parallelizer improvements

This improves the utility and efficiency of the parallelizer class, allowing it to:
- handle slow inputs gracefully (start processing inputs as early as possible)
- be restartable (enumerable reusable)
- efficiently handle first, take, drop and count
- stop processing inputs after exceptions occur, or after enumeration terminates
- make the thread pool stoppable and resizable
- option to send output through the enumerable as it comes, rather than in order (as by default)
- call each_with_exceptions to get the full output of the enumeration, including *all* exceptions (not just the first one)

Also adds good unit tests.