I'm a fan of doing more of `equals` too, especially in the docs. The docs currently just say to do `simplify(expr1 - expr2)`, but this doesn't work if `expr1` and `expr2` are not Expr-type expressions (e.g., logic expressions). 

I'm not sure if multiple dispatch is needed, though. You can just override equals on the classes (like Expr, Boolean, etc.). Two objects that are mathematically equal should share the same subclass of Basic ideally, so I doubt there will be much need for multiple dispatching here (as opposed to single dispatch). I could be wrong, though.