Update private ScaleoutStream.Send throw instead of calling SetError for the error to avoid the problem that stream will never be opened

Currently with Redis scale-out, once Send() method runs into an error, if the instance doesn't receive any message, then in the instance the stream will never be opened again until Redis is restarted. No connections in the instance can send a message. Instead they return the same error.

To avoid this problem,  here is the changes:
1). Update the private ScaleoutStream.Send throw the error instead of calling SetError when Send runs into exception.
2). Stream still keep Open, subsequent sends will not get affected by the error.
3). When Send throws exception, client caller receives error for the Send. 
4). When Send returns a faulted task and in the method which send to client uses await , client caller also receives error for the Send.
  
#3093
`syncEx` is thrown if it is set synchronously in the Catch callback. This ensures that any exceptions that are thrown synchronously propagate back to the application layer even if the caller isn't using `await`.