Clean up structural types definitions in Enumeratee

The structural types used in Enumeratee significantly raise the complexity of understanding the use of Enumeratees.

This commit moves the structural types out into type definitions, and, more importantly, hides the internals of the return types.