Fix broken job restarts after failures

Fixes #115 

When a job fails, the snapshot of the DAG is deleted, just like during completion. When we retry, the snapshot is not recreated, causing errors when trying to reach the next task after the failed tasks.

The fix is a simple one line addition to recreate the snapshot at the beginning of retry() and add a test case that tests this particular use case.
I think it's easy to imagine that `destroy_snapshot` would get a little more complicated down the road. It would be simpler to just store `deepcopy(self.graph)` into a temp var until we've validated it, then stick it into `self.snapshot` once we know it's good.