Changed simplify's behavior

By introducing simplify as new function and renaming the old simplify
function into simplifyOnce we can avoid infinite recursion; simplifyOnce
calls the specific function for a term (e.g. simplifySum) which
transforms it by one step. simplify calls simplifyOnce as long as
simplifyOnce delivers a term different from the one before
(like `until simplifiedTerm == term; simplify (simplifyOnce term)`)

This commit introduces some new rules as well.