BUG: Ensure volume node without default storage node can be saved.

This commit allows volume to be saved from python using
"slicer.util.saveNode()".

More specifically, this commit (1) factors out the code allowing to
create and add the default storage node to the scene  and (2) ensures a
call to "qSlicerCoreIOManager::saveNodes" work when there are no storage
node associated with a volume node.

This is needed because within the "saveNodes" function, calling the
function "qSlicerNodeWriter::extensions(node)" expects a storage node
to be present.

Thanks to Julien Finet for reviewing.

git-svn-id: http://svn.slicer.org/Slicer4/trunk@23677 3bd1e089-480b-0410-8dfb-8563597acbee
BUG: Ensure RemoveAllMarkups also invoke MarkupRemovedEvent

This commit improve the API consistency by ensuring the event will
be sent also if RemoveAllMarkups is called.

Similarly, the function "SetLocked" is called instead of directly
setting the ivar, doing so will ensure that the LockModifiedEvent
is also invoked.

Note that the pair StartModify/EndModify is used to ensure the ModifedEvent
associated with the markups node is invoked at the end if it applies.

For sake of consistency, the function RemoveAllTexts() has been added.
Since no text is added/removed when function Add/RemoveMarkup are called,
it doesn't make sense to clear the text when removing markups.