One last addition!
I think the big changes here are:
- when a view is depended on by another view, a rebuild should only pass the diff between the previous state and the new state
- this means that adding a new decryption key doesn't mean you re-stream all messages to other views
- this also means that views need to maintain their own state, which means that transforms should act like real views