asyncio: sync with Tulip

* Document why set_result() calls are safe
* Cleanup gather(). Use public methods instead of hacks to consume the
  exception of a future.
* sock_connect(): pass directly the fd to _sock_connect_done instead of the
  socket.
diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py
index 8f6c257..dce0d53 100644
--- a/Lib/asyncio/queues.py
+++ b/Lib/asyncio/queues.py
@@ -126,6 +126,8 @@
             # Use _put and _get instead of passing item straight to getter, in
             # case a subclass has logic that must run (e.g. JoinableQueue).
             self._put(item)
+
+            # getter cannot be cancelled, we just removed done getters
             getter.set_result(self._get())
 
         elif self._maxsize > 0 and self._maxsize <= self.qsize():
@@ -152,6 +154,8 @@
             # Use _put and _get instead of passing item straight to getter, in
             # case a subclass has logic that must run (e.g. JoinableQueue).
             self._put(item)
+
+            # getter cannot be cancelled, we just removed done getters
             getter.set_result(self._get())
 
         elif self._maxsize > 0 and self._maxsize <= self.qsize():
@@ -200,6 +204,8 @@
             item, putter = self._putters.popleft()
             self._put(item)
             # Wake putter on next tick.
+
+            # getter cannot be cancelled, we just removed done putters
             putter.set_result(None)
 
             return self._get()