Modify Modification architecture
The current modification architecture is a bit fragile.
Modify it such that each modifier creates a modification object (that is a concrete implementation of an AbstractModification object) which is saved inside SimulationSetup and has a function inside it that makes the modifcations and is run every time simulation setup runs reset(). This means that we only need to save the bare minimum for each modified object.