Abs evaluates as integer/rational when needed

Added many tests as well.
Is this for:
```
In [3]: z = 3 + 4*I

In [4]: z.is_integer
Out[4]: False

In [5]: abs(z)
Out[5]: 5
```
?