Switch from setup.py to pyproject.toml and update version to 0.9.17

Attempt to follow the Python Packaging guidelines and
switch from the traditional setup.py mechanism for describing
things to pyproject.toml.

I've probably messed up some things in this attempt.
diff --git a/README.md b/README.md
index 2d657bc..f621a8f 100644
--- a/README.md
+++ b/README.md
@@ -70,10 +70,15 @@
 
 # Upload the packages
 $ python3 -m twine upload dist/*
+
+(Assuming you have upload privileges to PyPI, of course.)
 ```
 
 ## Version History / Release Notes
 
+* v0.9.17 (2024-02-19)
+    * Move from `setup.py` to `pyproject.toml`.
+    * No code changes (other than the version increasing).
 * v0.9.16 (2024-02-19)
     * Drop Python2 from `setup.py`
     * Add minimal packaging instructions to `//README.md`.
diff --git a/json5/version.py b/json5/version.py
index 1e186b1..a47581c 100644
--- a/json5/version.py
+++ b/json5/version.py
@@ -12,4 +12,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-VERSION = '0.9.16'
+VERSION = '0.9.17'
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..b86e56e
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,40 @@
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "json5"
+authors = [
+    {name = "Dirk Pranke", email = "dpranke@chromium.org"},
+]
+license = {file = "LICENSE"}
+dynamic = [
+  "description",
+  "readme",
+  "version",
+]
+requires-python = ">= 3.8"
+classifiers= [
+    'Development Status :: 5 - Production/Stable',
+    'Intended Audience :: Developers',
+    'License :: OSI Approved :: Apache Software License',
+    'Programming Language :: Python :: 3',
+    'Programming Language :: Python :: 3.8',
+    'Programming Language :: Python :: 3.9',
+    'Programming Language :: Python :: 3.10',
+    'Programming Language :: Python :: 3.11',
+]
+
+[project.urls]
+Repository = "https://github.com/dpranke/pyjson5"
+Issues = "https://github.com/dpranke/pyjson5/issues"
+Changelog = "https://github.com/dpranke/pyjson5/blob/master/README.md"
+
+[project.optional-dependencies]
+dev = ["hypothesis"]
+
+[project.scripts]
+pyjson5 = "json5.tool:main"
+
+[tool.setuptools.dynamic]
+version = {attr = "json5.VERSION"}
diff --git a/setup.py b/setup.py
index 2721bd9..8f138f7 100644
--- a/setup.py
+++ b/setup.py
@@ -12,52 +12,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import os
-import sys
+from setuptools import setup
 
-from setuptools import setup, find_packages
-
-here = os.path.abspath(os.path.dirname(__file__))
-if here not in sys.path:
-    sys.path.insert(0, here)
-
-import json5
-
-with open(os.path.join(here, 'README.md')) as fp:
-    long_description = fp.read()
-
+from pathlib import Path
+here = Path(__file__).parent
+long_description = (here / "README.md").read_text()
 
 setup(
-    name='json5',
-    packages=find_packages(exclude=['tests']),
-    entry_points={
-        'console_scripts': [
-            'pyjson5=json5.tool:main',
-        ]
-    },
-    install_requires=[
-    ],
-    extras_require={
-        'dev': [
-            'hypothesis'
-        ]
-    },
-    version=json5.VERSION,
-    author='Dirk Pranke',
-    author_email='dpranke@chromium.org',
+    name="json5",
     description=long_description.splitlines()[2],
     long_description=long_description,
     long_description_content_type='text/markdown',
-    url='https://github.com/dpranke/pyjson5',
-    license='Apache',
-    classifiers=[
-        'Development Status :: 5 - Production/Stable',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: Apache Software License',
-        'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.8',
-        'Programming Language :: Python :: 3.9',
-        'Programming Language :: Python :: 3.10',
-        'Programming Language :: Python :: 3.11',
-    ],
 )