BUG: Fix bound checking for Timestamp() with dt64 #4065

To fix the bug, this change adds bounds checking to
_get_datetime64_nanos() for numpy datetimes that aren't already in [ns]
units.

Additionally, it updates _check_dts_bounds() to do the bound check just
based off the pandas_datetimestruct, by comparing to the minimum and
maximum valid pandas_datetimestructs for datetime64[ns].  It is simpler
and more accurate than the previous system.

Also includes a number of small refactors/fixes to deal with new error
cases that didn't exist when invalid datetime64s were just silently
coerced into the valid datetime64[ns] range.
DOC: revised io.rst
Merge branch 'timestamp-object-bounds' of https://github.com/danbirken/pandas into danbirken-timestamp-object-bounds

Conflicts:
	doc/source/release.rst
CLN: clean up frame.py
BUG: convert replacement tuples to list in recursive call to avoid the seeming passage of regular expressions