[WIP] Add shell compositing

This Pull Requests adds a few missing abstraction layers between a surface, its shell, a monitor and the buffers below it.

This is basically all just one feature, make compositing easy.
I'd prefer one cast instead of two. Can you rewrite this part to only contain one cast?