WIP: ElGamal encryption

TODO:

- [x] Detail algorithm in docstring
- [x] Add more test case
- [x] Use primitive_root in #2307