Add OutboundCall for call site options (#648)
Add OutboundCall for call site options (#648)

This adds an `OutboundCall` type which allows encoding authors to provide a
`CallOption`-based interface to customize request behavior and receive
response headers. Call options affect per-call options for a request at the
call site.

Client implementations in encodings will apply call options to a call and use
that to hydrate a `transport.Request`. For example, consider,

```
func Call(
    ctx context.Context,
    reqBody MyRequest,
    opts ...yarpc.CallOption,
) (resBody MyResponse, error) {
    // ...
}
```

Where `MyRequest` and `MyResponse` are encoding-specific representations of
request and response bodies. The implementation will simply do,

```
call := yarpc.NewOutboundCall(opts...)
req := transport.Request{
    // Fill with client-level information
    Caller: ...,
    Service: ...,
    // And the encoded request body
    Body: serialize(reqBody),
}

ctx, err := call.WriteToRequest(ctx, &req)
if err != nil {
    return err
}

// Call the outbound
res, err := outbound.Call(ctx, req)
if err != nil {
    return err
}

ctx, err = call.ReadFromResponse(ctx, res)
if err != nil {
    return err
}
```

Issue: #617 
yarpc/yarpc-go,yarpc/yarpc-go