[BREAKING] Shift plugin initialization; Addresses BUKKIT-1788

This reverts commit ae4f1c05d825e232d7fc0483639ba65ad54d2db4, restoring
commit 27cb5e7c9c6b2cfc5419262df75d89bc6bfe7879 (mostly).

Shared class loading was removed as an explicit feature in the plugin.yml,
as all plugins implicitly share class loaders already.

Some deprecated, internal functionality is now (package) private, namely
some sections pointed out in 203de4180b40f069d2c175d763476bd4ce338c76.
Add method to get plugin by its class. Adds BUKKIT-5240

Currently, the only way to get a plugin is by name or using a static
variable. This adds two methods to get a plugin based on its classes,
utilizing the plugin classloader.
Add unit tests for org.bukkit.util.StringUtil
Use region matching instead of sub-strings. Addresses BUKKIT-5275
Fix some messages

Addresses BUKKIT-5272, BUKKIT-5282, and BUKKIT-5283
[Bleeding] Add 1.7 setworldspawn and setidletimeout commands. Addresses BUKKIT-4932
Modify give command to support 1.7 features. Fixes BUKKIT-5286

Necessary additions include an interface to add internal value conversions
that are inappropriate for proper API design. This acts as a substitute
for properly formed, user-friendly commands in an effort to maintain
relatively vanilla behavior.
[Bleeding] Fix Achievement and Statistic API. Fixes BUKKIT-5305
[Bleeding] Add /achievement command. Addresses BUKKIT-4932
Add ServerListPingEvent player list API. Adds BUKKIT-5121, BUKKIT-2465
[Bleeding] Fix logic for calculating slot in Creative mode. Fixes BUKKIT-4715

Previously, hotbar slots for player inventory would return 9 - 18 while in
Creative mode, rather than 0 - 9. This commit fixes the logic used for
calculating the returned slot based on the raw slot.
Add methods to get and set knockback strength in Arrow. Adds BUKKIT-5103
Add setCritical and isCritical methods to Arrow.java. Adds BUKKIT-5113
[Bleeding] Add ProjectileSource interface. Addresses BUKKIT-1038, BUKKIT-1156
[Bleeding] Add setCharged and getCharged to WitherSkull. Adds BUKKIT-3060
Added SpawnReasons for nether portals and dispensers. Fixes BUKKIT-3148

Previously any entities spawned through dispensers (monster eggs) or
by nether portals were given the incorrect SpawnReason of SPAWNER_EGG.
This made it impossible to distinguish what exactly happened in regards
to the creature being spawned.

With the additional two SpawnReasons, plugins can identify sources of
creature spawning more easily and accuratly.
Add banning API and resolve associated command issues. Adds BUKKIT-3535.
Fixes BUKKIT-5371 and BUKKIT-4285

Prior to this commit, ban reasons were not supported by banning commands.
Additionally, the player(s) affected by the ban-ip command would not have
been removed from the server via a kick.

The Bukkit API lacked support for modifying various attributes associated
with bans, such as the reason and expiration date. This caused various plugins
to use external or other means to store a ban reason, making the built-in
banning system on the server partially useless.

Now the ban commands will accept reasons for the bans as well as kick the
player from the server once banned. That means that if an IP is banned
that all players using that IP will be removed from the server.

The API provided now supports editing the ban reason, creation date,
expiration date and source. The ban list has also been created to
provide this information more easily. Editing the data requires an
implementing plugin to manually save the information with the provided
method in BanEntry or BanList once changes have been made.

The addition of this API has deprecated the use of OfflinePlayer#setBanned()
as it has been replaced by BanList#addBan().
[Bleeding] Blacklist certain plugin names
[Bleeding] Blacklist ":" in command names.
[Bleeding] Simplify command handling.

Instead of duplicating code to handle two pools of commands
we can instead just add the fallback commands after all
plugin commands are loaded and achieve the same effect. We
also now always register the direct address of a command
to ensure it is always possible to access it.

In addition, aliases can be determined by whether or not
the command label of the command matches the command address,
thereby rendering the aliases HashSet redundant.