Dispose Stream even when Stream.ReadAsync does not honor CancellationToken
Dispose Stream even when Stream.ReadAsync does not honor CancellationToken

`PipeStream.ReadAsync` does not honor `CancellationToken` on .NET Framework.
This change works around this limitation by calling `Stream.Dispose()` when we're sure that the UsePipe front-end user is done using it, which causes the ReadAsync call to complete.

Fixes #162

AArnott/Nerdbank.FullDuplexStream