Remove some allocation from NotifyCollectionChangedEventArgs (#54899)
* Remove some allocation from NotifyCollectionChangedEventArgs
When initialized with a single object rather than a list of objects (single object is very common), the args is allocating an object[] and then wrapping that object[] in a ReadOnlyList. We can instead just allocate a simple read-only IList wrapper for the object directly; that also makes accessing it faster.
Additionally, when constructing an instance using `public NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction action, IList? changedItems, int index, int oldIndex)`, even though the same collection instance is used for both the new and old items, it wraps it twice. We can wrap it once.
Along the way I also simplified the code, enabling the fields to become readonly, removing duplicate assignments of fields, etc.
* Address PR feedback