Add a simple EndpointRelayer that just relays messages between two ChannelEndpoints.

Before this change, this was done by using/abusing MessagePipe. After
this change, all MessagePipe objects will always have (at least) one
local endpoint.

More importantly, this is a proof-of-concept that we can have
ChannelEndpoints change their client. (This will be needed to handle
different situations -- the replacement client can handle handshaking
required in transferring message pipe handles.)

R=yzshen@chromium.org

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