Move test.test_support.catch_warning() to the warnings module, rename it
catch_warnings(), and clean up the API.

While expanding the test suite, a bug was found where a warning about the
'line' argument to showwarning() was not letting functions with '*args' go
without a warning.

Closes issue 3602.
Code review by Benjamin Peterson.
diff --git a/Lib/asynchat.py b/Lib/asynchat.py
index 121b467..a97de93 100644
--- a/Lib/asynchat.py
+++ b/Lib/asynchat.py
@@ -49,8 +49,9 @@
 import socket
 import asyncore
 from collections import deque
+from sys import py3kwarning
 from test.test_support import catch_warning
-from warnings import filterwarnings
+from warnings import filterwarnings, catch_warnings
 
 class async_chat (asyncore.dispatcher):
     """This is an abstract class.  You must derive from this class, and add
@@ -218,8 +219,9 @@
             # handle classic producer behavior
             obs = self.ac_out_buffer_size
             try:
-                with catch_warning(record=False):
-                    filterwarnings("ignore", ".*buffer", DeprecationWarning)
+                with catch_warnings():
+                    if py3kwarning:
+                        filterwarnings("ignore", ".*buffer", DeprecationWarning)
                     data = buffer(first, 0, obs)
             except TypeError:
                 data = first.more()