core - REFACTOR - introduce AbstractResponse

make responses implementation more consistent
don't rely on underlying implementation for PrintWriter, always use underlying
OutputStream only
core - introduce RestxResponse.getCharset() [BREAKING]

[BREAKING] if you implemented RestxResponse interface, you will have to implement this
method. It is now recommended to extend AbstractResponse to do so.
core - review response wrapper getWriter implementation

it now delegates to getOutputStream(), making it much easier to wrap the response stream.
core - try to close response as soon as possible [BREAKING]

it is the route that should be closing the response. Because there are many routes
 implementation, we introduce a ResponseCloserFilter which is responsible for closing
 the response.

 The point is that now the main router can't be sure if the response has been closed or not,
 so we need to make sure that a response close() method can be called more than once.

 Therefore we introduced isClosed() method on RestxResponse, which is a breaking change.

 The whole point of closing the response as soon as possible is that if a filter wraps
 the response, close will be called on the wrapped response, and not only the original one,
 which is what can be expected by a filter.

 [BREAKING] added a close() method to interface RestResponse, implement it if you implemented RestxResponse directly
core - introduce gzip filter

gzip all responses as soon as client accepts gzip encoding

paths to handle can be configured using `restx.http.gzip.paths` setting.