knotserver: last commit for each file
This is a super trivial implementation last commit for each file. It's slow and inefficient despite using ristretto for in-memory caching.
We should move this to storing in sqlite in the future.
Reconnection is now handed by cancelling the connCtx context. This is a lot cleaner and the jetstream client package honors context cancellation.
Saving of last time_us is also simplified now. We only save (update, rather) after the last seen event by incrementing the event's time_us by 1 (this is ok since it's a monotonic clock). We pick up from here upon reconnect and don't save last time_us for any other reason.
Lastly, outside of first boot, we should only ever use UpdateLastTimeUs.
nix: builds for repoguard and keyfetch
This needs another pass to fix the intermediate directory links etc.
This is handy because the knotserver only subscribes to specific dids, and we don't want jestream to run without (which defaults to all dids). The oppsite is true for the appview which wants to see all dids.
Also adds some nil checks to ensure it doesn't break when event is not a Commit.