Speed up ShroudRenderer.UpdateShroud.

Testing for shrouded/fogged tiles requires GetEdges to run the isVisible delegate 9 times per cell. This delegate can be fairly cheap or somewhat expensive. As a result, it's faster to test visibility for tiles in the region ahead of time and cache the results - this means the delegate is only run 1 time per cell instead of 9. The GetEdges method can then perform its 9 way checks against the array which is far less costly. This makes UpdateShroud about 2x as fast overall.

I observed CPU usage for UpdateShroud drop from 6.4% to 3.1% of all time spent in some profiling I ran.
It might be cleaner to enumerate a CellRegion, as that internally handles the map/cell coordinate book keeping.