Allow, but not require, concurrent filesystem operations

This implements something close to the structures described in the comments of #1.  The main difference in the filesystem operation signatures from what was discussed before is that the type parameter is on the Request, not the Reply.

There were more changes needed to make concurrent filesystem operations actually _work_.  Along with that I rearranged the code a bit, which I hope leaves it in a state that makes sense.  It started when I needed to repurpose `Request`, and thus moved the `dispatch` fn to session (which makes more sense--it was mutating the session object anyway.)  Then it seemed odd that some of the channel-handling code was in session, so I moved it to channel with the rest of it.

I split this into two commits so that if you look at the second commit, you can see the actual changes, as opposed to this being hidden among the moves.