Big commit: overhaul the way we deliver data to endpoint.

The idea here is to make endpoint_recv a (right now, thin) wrapper
around recv and so allow the endpoint user to opaquely call recv on
the client socket to stream data into the endpoint, just like recv
would do. Thus we don't have to worry too much about marshalling data
in the primary server, we can just defer responsibility to the
endpoint to make sure it has got all the data the client sent (or
not).

What we do now is simply peek at the first N bytes of the received
data (so don't remove them from the kernel data queue) and from it try
to determine the protocol, method, and desired route. We use this to
set up the endpoint and then let the user actually do the full data
read.

Of course, right now the machinery for figuring out protocol, route,
etc is not advanced AT ALL, but the code as it stands seems modular
enough to get things moving or at least offer a good sketch. Also,
ideally we would use knowledge of the protocol to strip out all usable
data so that the user doesn't have to do anything at all, but that is
perhaps a next step. It also isn't very C-like...

Changed the endpoint_send/recv functions to have similar typing to
send/recv, ie ssize_t returns etc.

TODO am doing a lot of exiting now from the endpoint blocl and am not
sure if it's premature (ie want to poll more) OR if I'm doing too
much...