Remove reference cycles in LinearOperators et.al to allow garbage collection

I'm not sure that this is the right way.When MatrixLinearOperator is called repeatedly on copies, it seems to me that there is a increase in memory. (Though I don't know why)

    X = np.random.randn(24000, 2000)
    for _ in range(5):
        t = MatrixLinearOperator(X)

If the range of the number is increased, one can see the increase in memory usage. A stopgap is to delete the attributes after every call that seems to work fine.

Sklearn's Ridge solvers use the `lsqr` function and when it is called repeatedly across a cross-validation object, it sometimes blows up the memory. The discussion in https://github.com/scikit-learn/scikit-learn/issues/3762 articulates this.