We may want to take a step back and consider whether or not `run` should still supporting having the `start` and `end` paramaters.

One thing to note is that if `run` is supporting multiple runs, e.g. on a DataFrame, all runs would share the same sim_params if this logic is used.

Should this logic be changed so that this `self.sim_params` is in the `__init__` and then if `start` and `end` are specified a new `sim_params` is created?
The specifying parameters and of `start` and `end` seems at odds with the concept of simulation parameters.