Improvements to Player lookup - Resolves BUKKIT-4608

Many sections of code does player lookups by iterating every online player
and doing name comparisons. This is very ineffecient and can reduce performance
on servers with high player count.

By using a map based approach for most player lookups, player lookup
performance should scale better with increased amount of players.

This also improves Server.getPlayer() by trying an exact match first and also
by not creating a copy of the player list.