Proper way to clean up after each test
I am using `koa@2.0.0`.

I have the following unit test:
```
      describe('should return endPoint response with valid token', () => {
        let token,
            server,
            response,
            app;
    
        beforeEach(async () => {
          app = new Koa();
    
          const router = new Router();
    
          router
            .use(TokenAuth)
            .use('/admin', adminRoutes.routes());
    
          app
            .use(parser())
            .use(router.routes());
    
          server = http.createServer(app.callback()).listen(3000);
    
          const opts = {
            expiresIn: config.token.expires
          }
    
          token = jwt.sign({id: 66}, config.token.secret, opts);
    
          response = await request(server)
            .get('/admin/ping')
            .set('Authorization', `Bearer ${token}`);
        });
    
        afterEach((done) => {
          server.close(done);
        });
    
        it('should return protected response', () => {
          expect(response.body).to.eql({ response: 'pong' });
        });
    
        it('should return respond ok', () => {
          expect(response.status).to.equal(200);
        });
      });
```
I am creating the koa application after every test.

The problem is that I have two tests and if I comment one out then everything is ok, but if I have both running then the second one will give me a 404 for the request and the middleware does not seem to be applied to the app second time round.

I have also tried this where the app is scoped to the `it` but the same problem persists, the tests pass if one is commented out but not when there are more than one test:
```
context('TokenAuth middleware', () => {
  let token;

  describe('GET /admin/ping without token', () => {
    it('should return a 401 unauthorized response', done => {
      const app = new Koa();

      const router = new Router();

      router
        .use('/admin', adminRoutes.routes());

      app
        .use(parser())
        .use(router.routes());

      request(app.listen())
        .get('/admin/ping')
        .expect(401)
        .end(done);
    });
  });

  describe('should return endPoint response with valid token', () => {
    it('should return protected response', done => {
      const app = new Koa();

      const router = new Router();

      router
        .use(TokenAuth)
        .use('/admin', adminRoutes.routes());

      app
        .use(parser())
        .use(router.routes());

      const opts = {
        expiresIn: config.token.expires
      }

      token = jwt.sign({id: 66}, config.token.secret, opts);

      request(app.listen())
        .get('/admin/ping')
        .set('Authorization', `Bearer ${token}`)
        .expect(200)
        .end((err, response) => {
          expect(response.body.response).to.equal('pong');
          done();
        });
    });
  });
})
```
My question is, how do I clean up after every test so that it can be recreated again?

I have tried asking on stackoverflow but no replies.