* reflog
- use `gix` to parse reflog, both in code as well as in tests (to be sure it's not malformed)
- avoid double-writes to reflog, instead finish transformation in memory and write final result
- assure the ref is present, independently of the reflog, catching more 'weird' states.
* minor improvements to `snapshot.rs` to avoid unnecessary clones
Otherwise, tests will pickup global configuration, which can affect them.
For instance, if `core.gpgsign` is true, it will cause commits to be signed
which can be slow, or hang entirely if gpg-agent requests a password.
Note that now there is possibly no tests that validates signing,
and doing so is difficult as it requires gpg and keys to be setup.
This will prevent half-written content on disk in case the write is interrupted.
Lock files are *not* used as the assumption is that a lock is held centrally.
The idea is that we don't parallelize over a channel anymore, but
instead just process filesystem events, one at a time.
This would allow each handler to become a function that gets its
state passed, and makes all the necessary calls verbatim, which
in turn makes it easy to follow what's happening.
If anything becomes to slow due to the serialization of event processing,
selective parallelization can be re-added.