Allow libphutil libraries to load arbitrary runtime code from extensions/
Summary:
Currently, users need to build a libphutil library in order to add runtime code to Phabricator. While desirable for larger applications, this is fairly complex and offputting, and users have a relatively low success rate with it.
Instead, make libphutil recognize an extensions/ directory and load arbitrary code from it at runtime, so that installs can drop code into this directory without needing to build a library.
(The tricky part here is that we update the class map so that PhutilSymbolLoader can select these classes correctly.)
Ref T2971.
Test Plan: Unit tests.
Reviewers: vrana, btrahan
Reviewed By: btrahan
CC: aran, AnhNhan
Maniphest Tasks: T2971
Differential Revision: https://secure.phabricator.com/D5714