Change core::scope to be more generic.

It has been renamed to 'scope_guard', and to create one easily, one must
use the make_scope_guard function which takes a callable object, and
creates a scope_guard from it. Please note that the callable object must
be std::move-able. The requirement that the callable must not throw an
exception still holds.

The documentation must still be updated.
Add observer_ptr<T> ('the dumbest smart pointer') to memory component

Add tests for observer_ptr<T>
Fix issues with core::make_observer

Finish implementing unit tests for observer_ptr
Update documentation on the scope_guard type