Add module dependency resolution

Summary: For extensions which rely on other extensions.
E.g.: For class hierarchies.

Load/InitM/InitT occur in dependency order
Shutdown/Unload occer in reverse dependency order

Example
  class CurlExtension : public Extension {
   public:
    const DependencySet getDeps() const override {
      return DependencySet { "asio" };
    }
    void moduleInit() override {
      /* Contains code which depends on Asio like:
      class CurlWaitHandle extends WaitHandle {
      }
      */
      loadSystemlib();
    }
  };

Reviewed By: @ptarjan

Differential Revision: D1462817