Made the response bodies more diverse

Previously you could only have a String type response body. This is fairly
limiting for when you may want to send binary blobs or maybe even complete
files. In order to make this work i needed to create a response type ADT and
allow the implementations of it to specify how each of them should send data
through the client socket's NIO channel. For files we use `FileChannel` and
the `transferTo` method which results in super effecient `sendfile` system calls.