TYP: Add TypeVars to NDFrame
Adding TypeVars to NDFrame methods that don't return optional values. This ensures that e.g. ``(DataFrame|Series).astype`` and ``(DataFrame|Series).copy`` have a known return type, which is nice.

Also adds ``PandasObject._ensure_type``, which is a method used to solve the problem with optional return values, but where we actually know the return type. This is a helper method to help with the tediousness of optional return values experienced in #30565.
thanks @topper-123 