* There is essentially no error handling. We report errors, but we
  don't fail when we see one. The main reason for this is that we
  don't know when each plugin will be run. If the first plugin
  encounters an error, we could quit right there. But what if the
  third one fails after the first two succeed? We would need some kind
  of rollback mechanism.

  For "mv", a rollback is conceivable. But with "rm", there's no going
  back. Maybe relying on the user to interpret the output and go
  fix stuff himself is the best we can do?

* Add OpenDKIM support.

* Rename the "dovecot" plugin to "filesystem".

* Implement moving of domains.

* The AgenDAV "user exists" test is wonky, because there's no real
  users in AgenDAV. Right now we check the "username" column in the
  "prefs" table, but all of the shares (and principals?) have URLs
  instead of usernames. We don't parse the URLs, and instead rely
  on doing find/replace of substrings in e.g. AgendavMv.

  In particular, this means that AgenDAV pruning does not work! If
  a user with default preferences is deleted, we don't notice.

* The "pretend mode" output is missing the destination information:

  # mailshears mv "test1@example.com" "test2@example.com"
  mailshears, 2020-01-30 14:40:09 -0500 (Plugin: MvPlugin)
  --------------------------------------------------------
  AgendavMv - Would move user test1@example.com (User not found) to .
  DavicalMv - Would move user test1@example.com (User not found) to .
  DovecotMv - Would move user test1@example.com (/var/spool/mail/vhosts/example.com/test1) to .
  PostfixadminMv - Would move user test1@example.com to .
  RoundcubeMv - Would move user test1@example.com (User not found) to .
