Fix CancellationTokenSourceTest.ReEntrantRegistrationTest

This test run on .NET would result in both "unregister" and "register"
set to a "true" value. In order to ensure that the "unregister = true"
fragment is not executed, its disposal needs to be registered after,
because on .NET the CancellationTokenSource has a LIFO behavior.

This change simplifies the code and makes the expected behavior
consistent with that of .NET.
Add testcases for callback and exception ordering

Translated from the F# testcases available here
https://github.com/fsharp/fsharp/blob/19507b98bc6a7995e9c19c40f044fdfeb578ef77/src/fsharp/FSharp.Core.Unittests/FSharp.Core/Microsoft.FSharp.Control/Cancellation.fs#L100
Use LIFO policy for CancellationTokenSource

The .NET implementation of CancellationTokenSource invokes the
callbacks in the opposite order from that of the registration.
In order to mixamize compatibility, use the same order.

Fixes ReEntrantRegistrationTest, Cancel_Order, Cancel_ExceptionOrder
(in CancellationTokenSourceTest) and
https://bugzilla.xamarin.com/show_bug.cgi?id=16992
Merge pull request #851 from ranma42/fix_16992v2

Fix bug #16992