leave channel construction and goroutining to callers

Allows control over buffering to the caller, at the expense
of some boilerplate code.