Besides solving, this function does several housekeeping tasks:
runs check_models
sets up the vector of times when outputs are wanted: see make_times_xde or make_times_dts
sets up \(y_0,\) the initial values vector (see get_inits)
solves the system
parses and attaches outputs (see parse_outputs)