ENH: Improved performance of qMRMLSceneModel

The indexFromNode method is called millions of times when there are a few hundred nodes and it browses through the whole model to find the requested node. Add a cache that stores the last search result and use it as a search hint.
New rows are always added to the cache, so the cache alone can be used to determine if a node is not yet in the model.

From: Andras Lasso <lasso@queensu.ca>

git-svn-id: http://svn.slicer.org/Slicer4/trunk@22667 3bd1e089-480b-0410-8dfb-8563597acbee
STYLE: Simplify code using vtkNew to register node with MRML scene

From: Andras Lasso <lasso@queensu.ca>

git-svn-id: http://svn.slicer.org/Slicer4/trunk@22668 3bd1e089-480b-0410-8dfb-8563597acbee
ENH: Optimized performance of observations management in vtkMRMLScene

Use a std::map< std::string, std::set<std::string> > instead of two
separate ReferencedIDs and ReferencingNodes vectors to make lookup,
insertion, and deletion much faster (especially scene close takes much
shorter time now).
Store both referenced and referring nodes by ID. It is simpler, safer,
and most of the time the node pointers were validated anyway using
scene->GetNodeFromID(node->GetID().

Also, use set instead of vector for storing unique IDs for improving
performance of scene loading (especially when the same scene is loaded
twice and a lot of IDs have to be generated).

Co-authored-by: Jean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>

From: Andras Lasso <lasso@queensu.ca>

git-svn-id: http://svn.slicer.org/Slicer4/trunk@22669 3bd1e089-480b-0410-8dfb-8563597acbee
STYLE: Move vtkMRMLScene method definitions into implementation file.

From: Jean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>

git-svn-id: http://svn.slicer.org/Slicer4/trunk@22670 3bd1e089-480b-0410-8dfb-8563597acbee