Improve highlight API, fix an env-building bug, and finish TextFilter.

These are logically separate commits; I recommend reviewing them a commit at a time.
> imapcat instantly tells me that the internal workings involve generating an interable from each element and then concating them together.

The difference is small in any case, but my concern is needlessly raising the bar to contribution. "cat" doesn't mean anything to a Python programmer (unless you're talking about the UNIX command), so it'd be an extra trip to the documentation. The intersection of Python and Haskell programmers isn't huge.

> Its like how if I can describe something using a reduction, I prefer it to a for or while loop.

Likewise, because it tamps down the possibility for side effects, making it easier to comprehend. But reduce() is part of the Python stdlib, so people don't have to stop what they're doing to go learn it.