Enable snapshot creation

Summary:
This enables building a new shapshot via the following mechanisms:

- A new SnapshotImage exists, which represents the *actual* snapshot that should be used. This is needed to handle multiple plans per project.
- A new Cause.snapshot value is bound to the build
- DefaultBuildStep is aware of snapshot causes
- Command.is_setup was added, and non-setup commands are excluded in snapshots
- Commit list now ignores builds which have Cause.snapshot
- Snapshot.build_id is now unique

Move snapshot abstraction into images

Reviewers: cf, johnw, vishal

Differential Revision: https://tails.corp.dropbox.com/D60626