Allow exceptions to propogate from solver thread to main thread.

Currently if an uncaught exception occurs in a multiobjective algorithm the thread will be terminated but the main thread will continue waiting for solutions indefinitely.

This change allows us to add exceptions to the blocking queue which will be rethrown by the BlockingSolutionIterator, thus terminating the main thread when the solver thread dies.

This change will require modifications to all MultiObjectiveAlgorithms as it changes the interface.
multiObjectiveSolve is no longer abstract, instead the abstract template method multiObjectiveSolveImpl should be implemented by the various algorithms.

Reviewers: @AtulanZaman @joseph2625 @mhyee