FIX: Describe NotImplementedErrors or use AbstractMethodError
This issue fixes #7872 by either describing the reason why a NotImplementedError is raised,
or by throwing an AbstractMethodError in the case of abstract methods (eg: Mixins) that
should be overwritten by the inheriting classes.

This issue is based on discussion of PR #7899 which was never merged.

merged via https://github.com/pydata/pandas/commit/8fe1cf6d1931071c378fcc3170b82a145a037da0

thanks!
 +1 great!!
