Move the unregister-from-backend handling up into the from-backend handling area
Merge branch 'register-and-remove-from-backend'

* register-and-remove-from-backend:
  Allow direct message route to notify of removal
  Re-enable registration
Allow direct message route to notify of removal

In case the backend is removing the user for policy reasons, etc, allows us to
clear out the message route setting when the backend is no longer listening.
Re-enable registration

It's not clear why it was ever removed.  I forget, and the commit and the
related issue both just say "disable for now".  So re-enable the code path.  No
one really uses it, but it's not dangerous and gives us a place to put other
registration code as well.
Expire JID Switch Key

I've added an expire command to the DB, and then I'm using it in the
JidSwitch branch.

I picked 24h as the expiry because I figure that'll give them enough
time to do some stuff but not clog up the DB or catch a bunch of people
Change JID Command

If the backend sends us a command we recognize as a JID change, we
intercept it and replace it with ours.

Ours asks which JID we want to move to and then asks that JID if it
wants to do this. When they register we ask them to confirm they want to
swap, and then send the backend the actual JID change operation.
Log ad-hoc bot command error for debugging
Remove cheoJid/owner when removing route

Since we no longer have any reason to believe this JID owns that tel anymore,
and also can't check anymore anyway, so just remove it.
Show Result Value with Newlines if Multiple Lines

I consolidated text-single and fixed into one method, and then also got
to use it for JID links.
Interpret Invalid Open List Numbers as Strings

This is a bit risky maybe, but previously if I was in the admin menu and
there I wanted to search by a phone number (that didn't start with +) or
a customer ID, I couldn't.

This is because the parser would intepret "4873278943" as an option I
wanted out of the numbered list, but that wasn't an option, so it would
ask me to pick another number.

Now instead I say if it's not a valid list, just pass it through as
Merge branch 'telToJid'

* telToJid:
  telToJid already does (filter isDigit)
More Datatypes in Result Forms

We previously assumed that only text fields would come back in results,
but that's no longer true. Some of them, like the "fixed" type would
work, but wouldn't look the same as they do when in an editable form,
whereas others like the list-single just didn't function at all.
Adhoc List Helper

This pulls some of the innards of the list processing out.
For now there's no good reason, but I'm about to use it to make a
display-only version.
telToJid already does (filter isDigit)

Doing it twice is redundant and breaks international +-prefixed detection.
Allow archive to work even when build --with-source
AdHoc Bot Continues on Result Forms

Previously it would display results and then be done, but I may want to
display resutlts and then continue, so I pulled the logic out of the
normal form-filling path and put it in result so it will continue
automatically if we're still executing.

This means that the bot will render back-to-back result forms as just a
dump of their output, but honestly that's probably fine.
What's the point in asking if they'd like to continue if I can just
continue until we hit a question we actually need the human to answer!
Secrets not available when building patchset
Fix build CI step for patchset
Add new dependencies to cabal file also