Lost information of data type when sets ctx.request.query
I wrote a middleware to check request parameters and handle their data type:
```
// /.middleware.js
export default async (ctx, next) => {
  //...
  ctx.request.query = handleParams(ctx.request.query);
  await next();
}
```
but if my handleParams only changes data type, for example: `input: { foo: '1' } output: { foo: 1}`, the assignment above would not work.
Then I read the implement of setter and getter of ctx.request.query, and I think it can solve the problem by updating query cache in the setter:
```
// koa/lib/request.js

  get query() {
    // return query cache directly:
    // return this._querycache[this.querystring];
    const str = this.querystring;
    const c = this._querycache = this._querycache || {};
    return c[str] || (c[str] = qs.parse(str));
  },
  set query(obj) {
    this.querystring = qs.stringify(obj);
    // update query cache here:
    // this._querycache[this.querystring] = obj;
  },
```
or fix it in own project:
```
// /.middleware.js
const qs = require('querystring');
export default async (ctx, next) => {
  //...
  const temp = handleParams(ctx.request.query);
  const tempqs = qs.stringify(temp);
  ctx.request.querystring = tempqs;
  ctx.request._querycache[tempqs] = temp;
  await next();
}
```
I'm not sure whether the problem is an issue or owe to my incorrect usage. 
Indeed, the document declared `request.query=` is to set query-string and `request.query` is to get parsed query-string, but when users set query `{ foo: 1 }` and then read out `{ foo: '1' }`, is it not an issue?
Thanks.