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.