Fix nodrain server handler on Async backend

Making a huge request to Async backend server that never dorain the
request body causes the server handler stuck.

Expecting `Pipe.closed` is wrong in general because a server handler can
close the pipe without draing the request body.

This fix introduces a synchronization variable to make sure reading a
request header after draining the last request body, like Lwt backend
does.