Turn the body-chunking option type into a GADT for stronger guarantees.

The types ensure that the chunking always returns a sequence of chunks
followed by an end marker.
Push the chunk-typing GADT through the code.