Add a ChannelEndpointClient abstraction.

This is to allow ChannelEndpoint to call things other than MessagePipe
(and make ChannelEndpoint know only about "clients" and not message
pipes). Clients can receive messages (from ChannelEndpoint, thus from
Channel), and be told that they'll no longer receive messages.

This is needed to allow Channel to handle certain "transitions" (when
passing message pipes between processes) specially, without dumping code
into MessagePipe.

R=yzshen@chromium.org

Review URL: https://codereview.chromium.org/738453003