Avoid superfluous CSEs from Idx and IndexedBase instances

Continuing my work on codegeneration of finite differences using Sympy I've come across
a possiblity for a minor enhancement of the cse routine:

consider:

```python
from sympy import *
len_y=5
i = Idx('i', len_y-1)
y = IndexedBase('y', shape=(len_y,))
x = IndexedBase('x', shape=(len_y,))

# Forward difference
print(cse((y[i+1]-y[i])/(x[i+1]-x[i])))
```
which outputs

```
([(x0, y), (x1, i), (x2, x1 + 1), (x3, x)], [(-x0[x1] + x0[x2])*(-x3[x1] + x3[x2])**(-1)])
```
here, the Idx and IndexedBase instances have been taken to be cses which makes e.g. code generation
much more verbose (in reality I have more indices and more IndexedBase).

This PR fixes the issue and only "i+1" is correctly identified as a true CSE.
If `Idx.is_Atom` is no longer true, this can be reverted back to how it was before.