Fixed a typo in AvlTree.DeleteRoot which caused the tree to be modified incorrectly.
Reimplemented AvlTree.TryDeleteMin/TryDeleteMax using pattern matching instead of calling DeleteMin/DeleteMax.
Made a minor but important optimization in the Delete and Insert methods -- we only rebalance when the tree was actually modified.