Improving the variable type inferencer to better handle overloaded operators.

   - when finding overloaded operators, try to infer all of them in the same case
   - infer the most general sort for variables, but afterwards the most concrete sorts for productions
   - reorganized a bit the data structures to make the code cleaner

Basically, pushing the limits of the type inferencer hoping to make it even more correct.

Let's see if the tests pass first.