We were falling through without propagating errors anywhere. I caught
most decryption errors and send them along in the new Err field in
DecryptionResult, to be then passed along to the bridge as a new type of
chat event.
I'm going to do another pass to catch any last decryption errors, but
this should be a big improvement over what we currently do.
* Change most columns to `NOT NULL`, including primary keys
(because SQLite).
* Change columns only storing signal user IDs (portal receiver, message
sender, user uuid) to use the `uuid` type instead of `TEXT`.
* Drop chat ID from message table primary key.
* Add part index to message table to replace timestamp hack for storing
multiple parts of the same message.
* Change query wrappers to use new QureyHelper struct in dbutil, and
pass contexts and errors everywhere.
As a part of changing the portal receiver from phone number to uuid,
old portals whose receiver isn't logged in anymore may be discarded.
The discarded portals will be stored in the lost_portals table for
cleanup or recovery.