always return channel from go block

When using channels to do promise-style work, you use the return channel *all the time*. It makes it significantly easier if we just always return a channel, which is what core.async `go` blocks do.

This might be slightly less performant, but I doubt it affects it too much. For now the usability win is worth it imho.

I have some ideas about error handling that will still work pretty well, but we can discuss that in a different issue (will make one later this week)