srepr(Symbol(...)) will show assumptions

The modifications here allow one to see a canonical representation of the assumptions needed to create a given symbol (whereas in master we can't see the assumptions easily and although we can inspect the assumptions0 mapping, there isn't a canonical representation of that):

```
>>> srepr(Dummy('',odd=1,positive=1))
"Dummy('', nonnegative=1, odd=1)"
>>> srepr(Dummy('',real=0,nonnegative=0))
"Dummy('', real=0)"
```
Did you time this? It seems inefficient.