Added IoC container and tests

Summary: IoC stands for "Inversion of Control"; it's basically a way of writing code that says "I want some that implements this interface", without the code knowing the actual implementation.  This allows us to write code (particular in the website) that says "I want something that implements IPhabricator" without actually being tied to the Phabricator implementation.  That way, when we're doing unit tests we can have a `FakePhabricator` that implements `IPhabricator` and the unit tests can test behaviour of systems without being reliant on particular implementations.

Test Plan:
Apply the patch, regenerate and rebuild.

  - Run `arc unit --everything`; all tests should pass.
  - Run Tychaia.Website and verify all of the pages work.
  - Run MakeMeAWorld and verify all of the pages work.

Reviewers: Sabre070

Maniphest Tasks: T39

Differential Revision: http://code.redpointsoftware.com.au/D26