ctx.body=null may make some confusing things
I found some code in the test case and **added a line** to describe the problem I encountered.
```
it('should respond 204 with status=200', async () => {
      const app = new Koa();

      app.use(ctx => {
        ctx.status = 200;
        ctx.body = null;

        // When I try to set ctx.body repeatedly, 
        // even if the value is not Null, it will still return 204
        ctx.body = { hello: 'world' }; 
      });

      const server = app.listen();

      const res = await request(server)
        .get('/')
        .expect(204)
        .expect('');

      assert.equal(res.headers.hasOwnProperty('content-type'), false);
    });
```
the reason is
https://github.com/koajs/koa/blob/master/lib/response.js/#L83-L92
https://github.com/koajs/koa/blob/master/lib/response.js/#L134-L145

This problem may be good to avoid, but if you don't pay attention, it will cause troublesome problems. 
So I posted the problem I encountered here and it might help others save some time.
