* Introduce snapshot class to track snapshot updates
This avoids the hassle of having to manually call emit.
* Better viewmodel ergonomics
- Rename `SubscriptionViewModel` to `BaseViewModel`. I feel this is
appropriate since that class does more than just manage subscriptions.
- `getSnapshot` is no longer an abstract method. It's simply a method
that returns the current snapshot state. This ensures that getSnapshot
result is cached by default which is required by `useSyncExternalStore`.
- `props` are a property of the base vm class so that actual VMs don't
have to keep creating this property.
* Update `TextualEventViewModel`
* Fix test
* Rename `TextualEvent` to `TextualEventView`
* Fix snapshot object not being merged
* Rename directory to `EventTileView`
* Fix broken snapshot
* Add test for snapshot class