ENH: Add array_equivalent, to address the handling of NaNs when comparing arrays for equality.

Added NDFrame.equals

Index, Float64Index, and MultiIndex's equal method now uses array_equivalent
instead of np.array_equal.
Goal: do not deteriorate performance by a factor of 7
Let Index use np.arary_equal by default.
Add a new method, `equivalent`, for handling NaNs.
Try using isnan
BUG: The change in array_equivalent makes it not work on object arrays.

To to salvage some usefulness in NDFrame.equals, we must loop to check
each column of the NDFrame separately.
TST: Add a dataframe with object, float and datetime64[ns] columns, each containing NaNs.
TST: Add test for complex arrays