Fix and improve `asyncio.run()` docs (GH-16403) (GH-16504)

(cherry picked from commit e407013089259e4c0b271703e1975bbcd578a2d5)

Co-authored-by: Kyle Stanley <aeros167@gmail.com>
diff --git a/Doc/glossary.rst b/Doc/glossary.rst
index e601e8b..9ce0357 100644
--- a/Doc/glossary.rst
+++ b/Doc/glossary.rst
@@ -247,7 +247,7 @@
       Fortran contiguous arrays, the first index varies the fastest.
 
    coroutine
-      Coroutines is a more generalized form of subroutines. Subroutines are
+      Coroutines are a more generalized form of subroutines. Subroutines are
       entered at one point and exited at another point.  Coroutines can be
       entered, exited, and resumed at many different points.  They can be
       implemented with the :keyword:`async def` statement.  See also
diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst
index 321b4f4..6829233 100644
--- a/Doc/library/asyncio-task.rst
+++ b/Doc/library/asyncio-task.rst
@@ -212,6 +212,8 @@
 
 .. function:: run(coro, \*, debug=False)
 
+    Execute the :term:`coroutine` *coro* and return the result.
+
     This function runs the passed coroutine, taking care of
     managing the asyncio event loop and *finalizing asynchronous
     generators*.
@@ -225,10 +227,6 @@
     the end.  It should be used as a main entry point for asyncio
     programs, and should ideally only be called once.
 
-    Return a result of *coro* execution, or raise a :exc:`RuntimeError`
-    if ``asyncio.run()`` is called from a running event loop, or a
-    :exc:`ValueError` if *coro* is not a courutine.
-
     Example::
 
         async def main():
diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py
index df68638..2e37e18 100644
--- a/Lib/asyncio/runners.py
+++ b/Lib/asyncio/runners.py
@@ -6,7 +6,7 @@
 
 
 def run(main, *, debug=False):
-    """Run a coroutine.
+    """Execute the coroutine and return the result.
 
     This function runs the passed coroutine, taking care of
     managing the asyncio event loop and finalizing asynchronous
@@ -21,10 +21,6 @@
     It should be used as a main entry point for asyncio programs, and should
     ideally only be called once.
 
-    Return a result of *coro* execution, or raise a RuntimeError
-    if `asyncio.run()`is called from a running event loop, or a ValueError
-    if `main` is not a courutine.
-
     Example:
 
         async def main():