package daemon: Add a Listener interface for Volume

* This way, Volume doesn't have to know Root.
* Suppress listener notifications for node monitoring events when there
  are were already events pending.
package daemon: Volume: Make sure move entry events don't get split
BString: Add StartsWith() and EndsWith() methods
packagefs/daemon: Ignore packages/ entries without .hpkg suffix
PackageFSActivationChangeRequest: Make items array 0 sized

That's more convenient to use and the actual size of an item is variable
anyway.
packagefs: Volume::_ChangeActivation(): Check 0 request size
package daemon: Root: Use a common job for volume work

Add VolumeJob which, besides the Volume, takes a Root method to be
invoked. That allows to replace the specific job classes by simple
methods.
package daemon: De/-activate all changed packages together

* We first process the node monitoring events, collecting the required
  package activation changes, then apply all changes together.
* Change the PackageFSActivationChangeItem/-Request structs. The former
  is no longer variable in size, which makes it easier to work with.