Basically remove depdency on GHC rewrite rules. The reason for
separating StreamD and StreamK instead of using rewrite rules:
* Separate types provide better reasoning for the programmer about
performance. Each type has its own pros and cons and the programmer
can choose the best one based on the use case.
* rewrite rules are fragile, led to broken performance in the past dues
to change in GHC.
* Rewrite rules lead to optimization problems, blocking fusion in some
cases, specifically when combining multiple operations e.g. (filter . drop).
* Rewrite rules lead to problems when calling a function recursively. For
example, the StreamD version of foldBreak cannot be used recursively when
wrapped in rewrite rules because each recursive call adds a roundtrip
conversion from D to K and back to D. We can use the StreamK versions of
these though because the rewrite rule gets eliminated in that case.
* If we have a unified module, we need two different versions of several
operations e.g. appendK and appendD, both are useful in different cases.