Early implementation of the services system

Services power both components and features, and are independent pieces
of the code which shouldn't require plumbing elsewhere in order to be
used.

Services have a number of requirements:
(1) They must follow a strict dependency model. Dependencies will have
to be declared within the service's header, and will be verified at both
compile and runtime.
(2) Their implementation must be strictly independent. We register them
with the ServiceManager using a static initializer. No changes should be
required elsewhere to power them.
(3) They must be testable. Creating a mocked service rather than a real
one must be easy, and must be done by the service manager.

We're not there yet, but this allows us to take the first steps towards
getting there.