Remove usage of channels for `ForEach`

A channel does not let us report errors, just close the channel. So we can't distinguish between running out of data and encountering an error, which is obviously bad.

We have closures in Go, so having to use a callback instead of using `range` over a channel isn't that big of a deal, and it lets us do error handling, which is something we should always be able to do.