public async Task StateMachineDemoBehaves()
        {
            DemoStatemachine demoStateMachine = new DemoStatemachine(DemoStatemachine.UnVerified);
            DemoContext      dc = new DemoContext {
                UserName = "******"
            };

            demoStateMachine.StateChanges += DemoStateMachine_StateChanges;

            var time = new ManualTimeProvider(DateTime.UtcNow);

            await demoStateMachine.Tick(time.Now, dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            time.AddTime(days: 1);
            await demoStateMachine.Tick(time.Now, dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            time.AddTime(days: 1);
            await demoStateMachine.Tick(time.Now, dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            time.AddTime(days: 1);
            // Finally the user verifies their email
            await demoStateMachine.VerifiesEmail(dc);

            time.AddTime(days: 1);
            await demoStateMachine.Tick(time.Now, dc);

            time.AddTime(days: 1);
            await demoStateMachine.Tick(time.Now, dc);
        }