MODE-2276 Changed how child node definitions are found when adding a child

The new logic attempts to limit the need to find the number of existing children
with the same name as the proposed child, and it provides reusable components
that will improve efficiency when using a single session to adding lots of
children under the same parent.
MODE-2276 Replaced the old logic to find child node definitions with the new logic

All of the places where the old logic was being used, including in the session's
pre-save (validation), have been replaced with the newer logic added in the previous
commit. I extracted the `SiblingCounter` nested interface (added in the previous
commit) into a separate abstract class with static methods to create commonly-used
implementations. The old logic has been removed.
MODE-2266 Added more performance tests for adding lots of nodes, both in deep and flat hierarchies.
MODE-2276 Improved efficiency of methods to add/remove/check mixins

The methods no longer gets `ChildReferences` when the added/removed mixin has no
have child node definitions. And they also don't look at the properties if the mixin
has no property definitions.
Merge pull request #1198 from rhauch/mode-2276

MODE-2276 Changed how child node definitions are found when adding a child
Merge pull request #1200 from hchiorean/MODE-2266

MODE-2266 Added more performance tests for adding lots of nodes, both in deep and flat hierarchies.