When a persisted ExecutionPlanSnapshot is on the run, re-create it from the snapshot rather than rebuilding it from scratch. This is one step on the journey towards being able to have a run worker that doesn't execute any user code and could run in the Dagster cloud, interfacing with step workers in the user cloud.
Requires moving a whole bunch of user code out of ExecutionStep/StepInput/StepOutput and just putting handles on those classes instead.
(@alangenfeld this is the result of rebasing past the mypy stuff and incorporating your feedback from the previous stack - this worked out simpler, way less new stuff on the snapshots, and no need to use the PipelineSnapshot at all. Made StepInputSource and StepOutput serializable and put them on the executionplansnapshot)