implementation for 24 game

I think a few things could be written in a more elegant way (the while in "fn e" for instance)... 
I tried using a  `for tok in self.lexer` but I got in trouble with ownership, because this borrows self mutably, so it does not allow me to borrow it again to call `self.p()`.
If you have any suggestions on how to refactor this, they would be very welcome
I think it is nicer to use `std::rand`, so anybody reading the code can instantly see that a function has been imported (because you would then call `rand::task_rng()` or `rand::sample()` instead of just `task_rng()` and `sample()`).