Reorganize serve methods.

The method serve(IHTTPSession) was not useful to override on its own as
the stock version executed a bunch of very important logic in it (parsing out
request bodies and so forth).  You could call super.serve() and throw
away the Response object, but that feels like a serious hack.

So here I've taken that core logic and moved it into a method called
serveInternal.  That method does its thing and then passes control to
serve().
Move files collection into session.

The files collection was passed into the old serve() method, but didn't
get added to IHTTPSession for users of the new entrypoint.  This
changeset remedies that situation.
Make parameters values Objects instead of Strings.

This change makes it possible to parse parameters into more complex
objects if desired.
Add hook for parsing "unusual" POST bodies.

It's possible to see a POST with a content-type that isn't one of the
standard form types (I'm thinking of JSON, here).  This change makes it
possible for users of the class to hook in and provide their own body
parsing logic (like deserializing a JSON string into an object).
Add support for the DELETE method.

In particular, DELETE can get a body just like POST or PUT, so this
changeset adds logic to ensure the body is parsed.
Add some new HTTP status codes.

Adding 303 (See Other) and 501 (Not Implemented).
Add support for UTF-8 encoded POST bodies.

Not much to see here.  When the POST body is parsed, make sure we use
UTF-8 as the text encoding instead of the platform default.
Include newlines in multipart data.

There's actually a rather tricky bug, here.  Unfortunately the
BufferedReader eats line endings, so at this point it's impossible to
determine what the actual line ending was.  As a cheap workaround, we
simply throw a DOS line ending on each read line.