incorporate pure iteratees

Description

1) Keep pure and monadic iteratees completely separate. This leads to a lot of code duplication.

2) Make an Iteratee class.

3) Incorporate pure and monadic iteratees into a GADT.

2 is possible and relatively clean. 3 would probably lead to the nicest user interface, however certain operations (e.g. (>>=)) would likely become quite complex. Another question is relative performance between options 2 and 3.