Reduce the size of the pipe (#49270)
- Use the pipe itself as the synchronization object
- Store the options instance as a way to reference shared settings
- Added a field to PipeOptions for storing if the Pool is the ArrayPool implementation of the MemoryPool
- Shrink PipeAwaitable in the common case
- Move the ExecutionContext and SynchronizationContext into a typed called the SchedulingContext. These types are mostly used with async await and it's extremely rare to have to capture any of this state.
- Shrink the size of PipeCompletion
- Since completion callbacks are deprecated they are rarely set. We remove the pool and the other fields and just store a list (which should be rarely used now).
- Reduce the default segment pool size to 4 items = 16K buffered
- The original size was optimized to avoid pool resizes but we need to balance idle memory and the potential resize cost of the resize.