REF: dont consolidate in BlockManager.equals
Avoid side-effects.

Side-note: with EA.equals recently added to the interface, should we update array_equivalent to use it?  ATM array_equivalent starts by casting both inputs to ndarray.
> Side-note: with EA.equals recently added to the interface, should we update array_equivalent to use it?

Probably, yes > With this change, we no longer use the Block.equals methods?

I think this is correct, will double-check and update. gentle ping This had a large performance regression in https://pandas.pydata.org/speed/pandas/index.html#frame_methods.Equals.time_frame_float_equal?commits=77f4a4d673e2d2b3f7396a94818771d332bd913c. Is that expected? Some slowdown can probably expected for this case since it went from block-wise to column-wise (while having a consolidated block). 

But I think a large part of the slowdown is due to `array_equivalent` being much slower for certain dtypes right now. For example, the FloatBlock had a custom `equals` method not using array_equivalent but:

```    
def equals(self, other) -> bool:
        if self.dtype != other.dtype or self.shape != other.shape:
            return False
        left, right = self.values, other.values
        return ((left == right) | (np.isnan(left) & np.isnan(right))).all()
```

and this is quite a bit faster:

```
In [5]: a = np.random.randn(N)      

In [6]: %timeit ((a == a) | (np.isnan(a) & np.isnan(a))).all()    
5.28 µs ± 366 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [8]: %timeit pd.core.dtypes.missing.array_equivalent(a, a)    
57.7 µs ± 2.2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
``` I suppose that a similar "fastpath" could be added to `array_equivalent`, though?

Also for DatetimeTZBlock, there was an override of `equals` for performance:

```
    def equals(self, other) -> bool:
        # override for significant performance improvement
        if self.dtype != other.dtype or self.shape != other.shape:
            return False
        return (self.values.view("i8") == other.values.view("i8")).all()
``` I think the thing to do here is optimize array_equivalent. see also #32339