The context can not work with _.cloneDeep
Test codes:

```js
const _ = require('lodash');
const Koa = require('koa');

const app = new Koa();

app.use((ctx) => {
    _.cloneDeep(ctx);

    ctx.body = {
        test: 'test',
    };
});

app.listen(3000);
```

```sh
curl http://127.0.0.1:3000/
```

```sh
  TypeError: Cannot read property 'length' of undefined
      at Object.length (/Users/admin/Downloads/test/node_modules/delegates/index.js:72:24)
      at isArrayLike (/Users/admin/Downloads/test/node_modules/lodash/lodash.js:11401:46)
      at keys (/Users/admin/Downloads/test/node_modules/lodash/lodash.js:13375:14)
      at baseGetAllKeys (/Users/admin/Downloads/test/node_modules/lodash/lodash.js:3094:20)
      at getAllKeys (/Users/admin/Downloads/test/node_modules/lodash/lodash.js:5916:14)
      at baseClone (/Users/admin/Downloads/test/node_modules/lodash/lodash.js:2726:39)
      at /Users/admin/Downloads/test/node_modules/lodash/lodash.js:2733:34
      at arrayEach (/Users/admin/Downloads/test/node_modules/lodash/lodash.js:530:11)
      at baseClone (/Users/admin/Downloads/test/node_modules/lodash/lodash.js:2727:7)
      at /Users/admin/Downloads/test/node_modules/lodash/lodash.js:2733:34
```

I found it was caused by the code here https://github.com/koajs/koa/blob/19f3353e5da6a0d52fb968a9429523585e42a288/lib/context.js

The simple code is like this:

```js
const _ = require('lodash');

const contextProto = {};
// delegates
Object.defineProperty(contextProto, 'length', {
    get: function () {
        return this.response.length;
    },
    set: function (val) {
        this.response.length = val;
    },
});

// new App()
const app = {
    context: Object.create(contextProto),
};

// new ctx
const ctx = Object.create(app.context);
ctx.app = app;
ctx.response = { length: 1 };

console.log(_.cloneDeep(ctx));
// console.log(_.cloneDeep(app));
```

When execute `_.cloneDeep(ctx)`, `app` will also be cloned. But `app.context` can not be clone, because `lodash` needs the `length` proproty to decide whether obj is array-like https://github.com/lodash/lodash/blob/2da024c3b4f9947a48517639de7560457cd4ec6c/isArrayLike.js

> It also happens on [request](https://github.com/koajs/koa/blob/19f3353e5da6a0d52fb968a9429523585e42a288/lib/request.js) and [response](https://github.com/koajs/koa/blob/19f3353e5da6a0d52fb968a9429523585e42a288/lib/response.js).

I think maybe we should do some special operations for `length` property, just like this:

```js
const _ = require('lodash');

const contextProto = {};
// delegates
Object.defineProperty(contextProto, 'length', {
    get: function () {
        return this.response?.length;
    },
    set: function (val) {
        if (this.response) {
            this.response.length = val;
        }
    },
});

// new App()
const app = {
    context: Object.create(contextProto),
};

// new ctx
const ctx = Object.create(app.context);
ctx.app = app;
ctx.response = { length: 1 };

console.log(_.cloneDeep(ctx));
// console.log(_.cloneDeep(app));
```

