public async Task        LockedTimeout()
        {
            var start = DateTime.UtcNow;

            try {
                var ewa = new EventWaitAsync();
                ewa.Signal();
                Assert.IsTrue(await ewa.WaitAsync(2000));
                Assert.IsFalse(await ewa.WaitAsync(2000));
            }
            catch (TimeoutException) {
                var time = (DateTime.UtcNow - start).Ticks;

                Assert.IsTrue((TimeSpan.TicksPerMillisecond * 1900) <= time && time <= (TimeSpan.TicksPerMillisecond * 2100));
            }
        }
        public async Task        LockedCancellation()
        {
            var start = DateTime.UtcNow;

            try {
                var ewa = new EventWaitAsync();

                using (var cts = new CancellationTokenSource(2000)) {
                    ewa.Signal();
                    await ewa.WaitAsync(cts.Token);

                    await ewa.WaitAsync(cts.Token);
                }

                Assert.Fail();
            }
            catch (OperationCanceledException) {
                var time = (DateTime.UtcNow - start).Ticks;
                Assert.IsTrue((TimeSpan.TicksPerMillisecond * 1900) <= time && time <= (TimeSpan.TicksPerMillisecond * 2100));
            }
        }