Fix type annotations for wrapped functions:
- Use a `ParamSpec` to capture the wrapped function arguments and a
separate `TypeVar` for the return type, so that the annotation can
accurately wrap just the return value in a `Coroutine` annotation.
- Add explicit type hints for functions that use @overload (which
are not compatible with `ParamSpec`).
- Add typing-extensions as a dependency (used for `ParamSpec` on older
Python versions)
- Add a few simple tests to verify that type hints now are producing
correct output.
Closes https://github.com/kumaraditya303/aioshutil/issues/4