TYP: NDFrame.pipe, GroupBy.pipe etc.
Type up `pipe` function and methods. This allows type checkers to understand the return value type from pipes, which is nice.

cc @simonjayhawkins  Updated. I think this is ok to merge? I think so. We may want to have an alias for this, but as the type is not yet complete I think we should leave that to later.

I say incomplete since we will replace the `...` of `Callable[..., T]` at some point, and that will require a second typevar to bind to self/obj.

but in the spirit of gradual typing, this gets the return type sorted. .pipe takes very generic callables, so I don’t think it’s possible to type more. Can you give an example what you’re thinking?

In python 3.10 there’s [something coming](https://www.python.org/dev/peps/pep-0612/ ) that may improve typing for .pipe, but that’s far in the future for Pandas... if func is a tuple, it is indeed not possible to bind to a keyword argument, but if func is not a tuple and args is not specified, then the function should take just 1 positional argument which is the object?

so one of the overloads would be

```
def pipe(
    obj: S, func: Union[Callable[[S], T], Tuple[Callable[..., T], str]], **kwargs
) -> T:
```
where S is a TypeVar and args not specified (args may need to be None, I can't remember off the top of my head)

Indeed, this is out of scope for now and I have approved the changes as is. Ok. I think it’s ok to wait with that... yeah, since we maybe pulling in some type stubs, https://github.com/pandas-dev/pandas/issues/28142#issuecomment-760549977, I suspect that we can't yet inline those stubs where the types are not compatible with Python 3.7 (without typing_extensions) and I suspect the overloads will be in stub file instead of inline ( and may be able to adopt PEP 612 sooner.) Thanks @topper-123 