Use raw pointers instead of smart pointers for UI

The problem with smart pointers is that we cannot initialize some
widgets in their constructor, due to the fact that for adding
children, we need an intact shared_from_this(), which is only
possible after the widget has been constructed and captured into
a smart pointer.

As this seems highly unintuitive and for long-lived objects such
as UI widgets with pretty clear ownership (parent owns child), we
decided to use raw pointers instead of smart pointers to mitigiate
such issues.