Storage for Engines

- I added a `engine_storage.py` that will storage potential optional for multiple simulators
- Cleaned up the openmm engine a little and added caching to the last generated snapshot
- fixed also an error when reading pdb files in creating the correct box_vectors
- I also added a function to the class wrapper of @storable classes that returns a dict of all subclasses of that type which is nice if you want to reconstruct a object from storage. This is so far only used for engines.
- We can also now succesfully restore an open simulation from storage using the new storage. it saves all necesary options, topology and an original template(snapshot)
- Right now this is not so useful since we can have only one openmm instance running per machine.

I still need to clean up the ipython examples and check the same for toy_dynamics