Implement subsystems interface and infrastructure

This adds a very simple infrastructure for supporting a subsystems
abstraction. A subsystem represents a single component of the operating
system; it does not necessarily directly map to a single device, but
rather a subset of common functionality, for example, a tty device, a
memory manager, process manager etc.
lib/macros: Fix syntax of n_elements macro
s/__OPTIMIZE__/NDEBUG/g

Replace the use of the __OPTIMIZE__ macro for the more explicit NDEBUG.
main: Print 'Hello, World!'
kernel: panic() and assert() dump messages to stdout
lib: s/format/fmt/g