title: NetworkStream.ReadAsync with a cancellation token never cancels
body: <p>Here the proof.<br>
  Any idea what is wrong in this code ?</p>
  
  <pre><code>    [TestMethod]
      public void TestTest()
      {
          var tcp = new TcpClient() { ReceiveTimeout = 5000, SendTimeout = 20000 };
          tcp.Connect(IPAddress.Parse("176.31.100.115"), 25);
          bool ok = Read(tcp.GetStream()).Wait(30000);
          Assert.IsTrue(ok);
      }
  
      async Task Read(NetworkStream stream)
      {
          using (var cancellationTokenSource = new CancellationTokenSource(5000))
          {
              int receivedCount;
              try
              {
                  var buffer = new byte[1000];
                  receivedCount = await stream.ReadAsync(buffer, 0, 1000, cancellationTokenSource.Token);
              }
              catch (TimeoutException e)
              {
                  receivedCount = -1;
              }
          }
      }
  </code></pre>