Support Decorators Maintaining Signatures of Generic Functions
As a follow up to #27393 I think I made a mistake in just typing some of the return values to be `Callable`. The following script highlights that issue:

```python
from pandas.util._decorators import Appender

def func1(num: int) -> int:
    return num

@Appender("")
def func2(num: int) -> int:
    return num

reveal_type(func1)
reveal_type(func2)
```

If you run that from the project root you'll get something like the following:

```sh
$ mypy foo.py
foo.py:10: note: Revealed type is 'def (num: builtins.int) -> builtins.int'
foo.py:11: note: Revealed type is 'def (*Any, **Any) -> Any'
```

We probably want to maintain the types of the signature for `func2` so I think need to use TypeVar for generic support. 

More info on the mypy side in:

https://github.com/python/mypy/pull/3113
https://github.com/python/mypy/issues/1551

So I think need something like:

```python
T = TypeVar('T', bound=Callable[..., Any])
# then decorators can return
-> Callable[[T], T]
```