An inbox table holds one row per notification, filed whether or not the
instance has SMTP. notifications list reads it (unread by default,
--all for the rest), notifications read <id>... | --all clears it, and
the dashboard carries the unread count.
repo watch / repo unwatch widen or narrow who hears about a
repository. A mute wins over owning it or having written the thread.
notifyUsers and notifyBody collapse into one notify(c, ids, notice):
an inbox row needs the repo, kind and link that the pair only composed
into a mail body.
Web surfaces for this land in the merge request stacked on top.
Ref #113