Remove several Timer-related allocations from CancellationTokenSource (dotnet/coreclr#20509)
When CancellationTokenSource creates a Timer, it passes itself as state, which then results in the Timer being rooted while it's scheduled. As such, the Timer object itself and the TimerHolder object it creates are largely irrelevant, and since CancellationTokenSource has access, it can just create the underlying TimerQueueTimer object directly. This means that every CTS that creates a Timer now creates two fewer objects, one of which was finalizable.
Commit migrated from https://github.com/dotnet/coreclr/commit/
628df3872905496e12a8252da7eb7731c05be4b4