First commit.
Added server-level encoding property.
Made TestReadLineAsync more robust about the number of lines read.
Simplify DataReader2.ReadLineAsync(). Fix a bug where changing the encoding did not affect already received (but not yet passed upstream) lines, and added a test for the same.
Moved server configuration properties to a separate ServerConfiguration class.
Remove NuGet packages from repository. Packages will be downloaded on first build.
Removed unused usings.
Began work on model and UI.
Replaced explicit infinite server-polling with IObservable-based message pump.
Implemented framework for loading and saving settings.
Added ObservableCollectionEx, an ObservableCollection of INotifyPropertyChanged objects. It also fires CollectionChanged events if its elements fire PropertyChanged events.
(Cosmetic) Removed unused usings and unnecessary casts.
Added lock-for-edit support for NotifyPropertyChangedBase objects. Locking suppresses PropertyChanged events to enable changing multiple properties as a single operation.
Added an overload of Settings.SaveAsync which only saves a particular setting.
Replaced ExpandoObject with Dictionary<string, object>. The dynamic nature of ExpandoObject isn't really needed.
Remember the JsonSerializer.Deserialize<> method instead of searching for it over and over again.
Ensure writer stays alive for the duration of the deserialization.
Settings: Add CollectionChanged listener to deserialized INotifyCollectionChanged values regardless of whether they're also INotifyPropertyChanged or not.
Settings: Replace deserialization to Dictionary<string, object> with strongly typed objects.

This change adds a project that acts as a pre-build parser of Settings.cs. This parser creates SettingsSerializationTypes.generated.cs with types corresponding to each setting file, with those settings from Settings.cs as properties which belong to that file. These types also get stored in a dictionary keyed by the filename, and the deserializer uses these types to deserialize the settings files.

The parser uses Roslyn.
Don't overwrite provided nickserv password with global password unless username also needed to be overridden.