MVVM
====
Libation is not strictly MVVM. It's not strictly anything. There are however efforts at moving some major components toward this pattern.

Primary View: ProductsGrid
Primary View Model: GridEntry

see also: https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/raise-change-notifications--bindingsource
BindingSource + INotifyPropertyChanged + DataGridView is the backbone of our implementation. The SortableBindingList (BindingList/BindingSource) automatically subscribes to each entry's NotifyPropertyChanged -- which is why our AsyncNotifyPropertyChanged.NotifyPropertyChanged is needed even though none of our code calls it.

- Adding or removing an entry to/from this BindingSource automatically updates the UI. No additional code needed.
- Calling NotifyPropertyChanged with the name of a field updates that field in the UI
- Calling NotifyPropertyChanged without a field name (or with an invalid field name) updates the whole entry in the UI
