Fixed panel add & remove for cases where multiple child panels are added to the same edge of a parent panel

This fix includes a refactoring that brings all logic related to docking panel behaviour into
the AbstractDockingWorkbenchPanelView and AbstractDockingWorkbenchPanelPresenter classes.
Subclasses need not be aware of the docking behaviour, and the tricky docking and undocking
logic is now collected into one place rather than spread across a series of helper classes.

Further, this refactoring sets up a containment hierarchy where docking panels no longer assume
anything about their parent widget, and never try to reparent themselves. These assumptions are
no longer safe now that apps can introduce their own panel types into the mix.