Pickling solver instances

This extends the abstract Solver class with __getstate__ and __setstate__ methods to support pickling of solver instances (a prerequisite for using e.g. multiprocessing). Furthermore, it adds support and tests for pickling gurobi solver instances.