- 8ch indent, no tabs

- structs in MixedCase, variables, functions in lower_case

- the destructors always unregister the object from the next bigger
  object, not the other way around

- to minimize strict aliasing violations we prefer unions over casting

- for robustness reasons destructors should be able to destruct
  half-initialized objects, too

- error codes are returned as negative Exxx. i.e. return -EINVAL. There
  are some exceptions: for constructors its is OK to return NULL on
  OOM. For lookup functions NULL is fine too for "not found".