Update System.Timers.Timer with Close() and Dispose() to have have separate logic as in MS .NET.

Throwing exceptions only on special situations, following MS implementation.
More unit tests for weird cases. Tests seem to pass on both platforms.
This is not needed, catch correct exception instead