fixup inefficient invisibility calculation for units

Units have a function with signature
bool unit::invisible(const map_location & loc, bool see_all)

which determines whether the unit, if it is invisible, would be
revealed if it were moved to map_location & loc.

The implementation of this function was needlessly inefficient, it
requires us to loop through the entire unit_map (all of the units)
to determine if any of them could ambush the unit.

However, in the course of this check, it filters out any units
whose location is not adjacent to the target location.

This function is called constantly whenever the display is updated
or the minimap is drawn, or when a unit is moved.

The improved implementation does not loop over all units, instead
it gets the list of (6) map locations which could be adjacent and
have a unit, and then queries for a unit at each of those
locations.
changelog