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 commit also corrects a loose lookup on adding and removing ops by
using getPlayerExact instead, as adding and removing ops is not a loose
match operation.

This also improves Server.getPlayer() by trying an exact match first and also
by not creating a copy of the player list.