`np.array_equal` treats NaNs in object arrays as equal:
```
>>> np.array_equal(np.array([np.nan], dtype='O'), np.array([np.nan], dtype='O'))
True
```
so `ObjectBlock.equals` does not need to be defined. `ObjectBlock.equals` can defer to `Block.equals`. Only `FloatBlocks` and `ComplexBlocks` need to define their own `equals` method, since, for example,

```
>>> np.array_equal(np.array([np.nan], dtype='<f4'), np.array([np.nan], dtype='<f4'))
False
>>> np.array_equal(np.array([np.nan], dtype='complex128'), np.array([np.nan], dtype='complex128'))
False
```