[feat] Objects as middleware
## Adding support for using objects as middleware

Currently Koa requires middlewares to be functions. To make developing class-based controllers a bit nicer, it would be helpful to also allow objects to be used as middlewares. For example:

```javascript
const myMiddleware {
  [Symbol.for('koa-middleware-invoke')]: ctx => {

  },
}

koa.use(myMiddleware);
```

Alternatively, a base class could be used that Koa recognizes via `instanceof`:

```javascript
class MyMiddleware extends KoaMiddleware {

  invoke(ctx) {


  }

}

koa.use(new MyMiddleware())
```

Although I suspect that the symbol approach is closer to today's Javascript meta.

There are of course workarounds possible, but this seems like a pretty low-overhead ergonomic feature. The implementation of `.use()` can optimize this away:

```typescript

  use (fn) {
    // This line is new.
    if (Symbol.for('koa-middleware-invoke') in fn) fn = fn[Symbol.for('koa-middleware-invoke')];

    if (typeof fn !== 'function') throw new TypeError('middleware must be a function!')
    debug('use %s', fn._name || fn.name || '-')
    this.middleware.push(fn)
    return this
  }
```

Happy to provide a PR for this if this is interesting, but thought I would first gauge interest.

## Checklist

- [X] I have searched through GitHub issues for similar issues.
- [X] I have completely read through the README and documentation.
