Implement BaseAggregateAsset::isEmpty() correctly.

...which revealed that the remove() logic is broken.
Rejigger removeLeaf(), replaceLeaf() to recurse with grace. Adapt tests.

Failure to recurse with $graceful = TRUE causes exceptions to be thrown
prematurely.
Introduce each() and eachLeaf() methods onto AssetAggregateInterface.
Move all() up to AssetCollectionBasicInterface and clarify its role.