Statically track the status of a Response by using a Phantom Type

Introduces two Phantom Types, Fresh and Streaming, which indicate the status
of a Response.

Response::start translates an Response<Fresh> into a Response<Streaming> by 
writing the StatusCode and Headers.

Response<Fresh> allows modification of Headers and StatusCode, but does
not allow writing to the body. Response<Streaming> has the opposite privileges.

Disadvantages:

Uses a Phantom Type, which some may find confusing.

Alternatives:

Continue to track this dynamically and provide publicly accessible methods for
conditionally updating Headers and StatusCode and disallow direct access or
mutation.

Keep doing what we do now, but expose headers_written.

Split Response into two structs and create a Response trait. This introduces
code duplication and new ways to interact with Headers and Status.

Fixes #6