Add experimental support for PyOpt and with it a whole bunch of optimisation algorithms, including SNOPT.

Interestingly SNOPT does not find the analytical control solution for the MMS example, which worked perfectly fine with 
all the algorithms that I have tried so far.
Fix a typo
use forget=False for derivative evaluations in the pyOpt callback
Add support for inequality constraints
Improve support for bound constraints for PyOpt