Expose a TPL friendly API for RPC style requests

This change also provides a way of cancelling requests, e,g,

```csharp
public async Task<int> MustCompleteInThirtySeconds(IPublishChannel channel)
{
    using (var cancellationSource = new CancellationTokenSource(TimeSpan.FromSeconds(30)))
    {
        int partOne = await channel.RequestAsync<int, int>(23, cancellationSource.Token);
        return await channel.RequestAsync<int, int>(partOne, cancellationSource.Token);     
    }
}

```