web: add InvitationsView

Also refrain from sending "update" database notifications if the row is
missing. I'm not entirely sure why this is happening: my hunch is that
there's an UPDATE on the invitations table (the end of
Invitation.process_messages sets my_messages= and their_messages=) which
is happening after the corresponding row has been deleted, so
ObservableDatabase.update() is failing to find any data to give to the
observer. This was causing the web frontend to throw some errors about a
missing ".data" property.

In the process of catching that, I changed ObservableDatabase to
serialize its rows earlier, just in case the rows were being changed
after they were queued for delivery to observers. Not sure that was
important.
combine invitations and contacts in the addressbook view