differentiator: store child subtrees in a sorted container.

This way we allow comparing subtrees in O(n) at the expense of inserting a child
in O(n*logn) instead of O(1).

Note that insertion of a subtree is O(n*logn) instead of expected O(logn) because
each comparison still takes O(n).

This also triggered a rewrite of simplification logic -- it became possible to
use a "subtree -> multiplier" map to reduce similar terms instead of comparing
each to each in O(n^2).

Also, the "optimize" visitor has been removed because divisors are now always
stored after multipliers, and it is easy to tweak output engines to print
multiplication-division nodes as fractions without rearranging nodes themselves.
(This has not been done yet.)
differentiator: visitor-simplify: implement simplification of a sum of fractions.

A sum of fractions is brought to its common denominator and transformed into a
fraction whose numerator is a sum.

a/b + c = (a+bc)/b

This allows to efficiently simplify the expression by expanding products by
distributive law of multiplication. (Next optimization.)