Made distinction between polymorphic (Equals) and concrete (operator ==) equality.

Added virtual Equals method for polymorphic equality, and added non-virtual == and != overloads in leaf classes.  The "default" Equals method calls the operator in the implementation (leaf) class.  Also ensured that The* (not This*) names are used for template functions.