Introduce new snapshotable semantics

Swap out the interface for Snapshotable to reduce indirections and increase flexibility. It also hides the internal Rev of a type, which leaked before. Snapshotables should expose a GetSnapshot method which is used together with the Join method to create a new Snapshotable at the revision of the given one. This should allow easy time advancing while keep the interface clear. All major types which are exposed by cotterpin implement Snapshotable. The reason Join() is not part of the interface definition is to make the return of concrete types possible.

* Snapshotable is expected to expose GetSnapshot()
* Snapshot, Dir, File & Event implement Snapshotable
* Join function as a way to advance in time towards the state of another Snapshotable
* Snapshot implements FastForward to jump to the latest rev