Adds two attributes which describe the stability of an API:
- `UnstableAttribute` indicates that we provide no API stability guarantees for the class between minor/patch versions. This is mostly applied to `*Impl` interfaces which describe the interface between core Avalonia and platform implementations
- `NotClientImplementableAttribute` indicates that an interface is stable for consumption by a client, but should not be implemented outside of Avalonia itself (either because custom implementations are not supported, or because as members may be added to its API)
* Add nullable annotations...
...to `AvaloniaObject`/`AvaloniaProperty`-related classes and a few other uncontroversial files.
* Check for null before first use.
* Don't need this check as base class does it.
We were previously calling `Optional.GetValueOrDefault<T>()` in order to convert an `Optional<object>` to an `Optional<T>` which meant that empty values were getting converted to default values, meaning that in certain cases change notifications weren't raised.
Add an `Optional<object>.Cast<T>()` methods (like we have in `BindingValue`) and use that in order to preserve empty values when ending a batch update operation.
Fixes handling binding notifications in `LogicalNotNote`. Previously if a `!` was placed in a binding that produced a `BindingNotification`, then `LogicalNotNode` tried to convert the `BindingNotification` to `bool` and failed, throwing an exception. Handle this properly.