Instead of passing around Nodes internally and casting them down to NodeImpl we should use the façade pattern and delegate from NodeImpl back to an implementation class which is used internally. This also avoids the problem of API clients accessing stuff they shouldn't by casting to the implementation.
Some initial work has been done already. What's left to do it:
- Push down as much as possible from ItemImpl, NodeImpl and PropertyImpl to the respective delegate classes
- Introduce the same pattern for SessionImpl and do away with SessionContext.