flushMicrotasks and flushTimers

I don't think this is correct when the timer was scheduled after some time has already been elapsed.  I think you'll need to do something like:

```dart
 var timeoutElapsed = _elapsed + timeout;
  _drainTimersWhile((_FakeTimer timer) {
    if (timer._nextCall > timeoutElapsed) {
```

and add a test for that.