Channel close cleanup

Closing cleanly is hard to get right (see TCP) ... but hopefully this gets us closer. Removes some of the magic, and makes sure that closing as an EOF works expected even when it happens before the channel is ready.