Issue title: exec() crashes Rust Python when taking large expression as argument
 Issue body: When we set the argument of exec() as a complex expression, Rust Python interpreter crashes Please check the following example. This example triggers segmentation fault on Rust Python 0.1.2 interpreter.

test.py
```
mylist = []
n = 10000
print(exec("mylist"+"+mylist"*n))
```

Actual output:

> Segmentation fault (core dumped)

System:

> Ubuntu 16.04
> Rust Python 0.1.2 interpreter
 Comments: 
 Comment 0: I'm under the impression that all these issues (#2782, #2781 and #2780) are related. We don't yet detect recursions when they appear in Rust level code (i.e rebinding `__repr__` as `__str__` then `__str__` calls `vm.to_repr` and the loop begins. Similar things probably happen for `exec` and family.

For Python code this appears to have been fixed in #1477. 

I'll open an umbrella issue to track all these and keep them localized in one overarching issue.
 Comment 1: Yup, `exec`, `eval` and `compile` all loop on `SymbolTableBuilder.scan_expression`.
 Comment 2: Thanks for all these @xiaxinmeng, I'll be closing them in favor of the more general one. Duplicate of #2796 
{'source': 'GithubIssues', 'repo_name_with_owner': 'RustPython/RustPython', 'issue_id': 957904136, 'repo_stars': 12042.0}