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
* 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