Avoid unnecessisary double chunk map lookups.

Several places in vanilla check if a chunk is loaded and if so get the
chunk. This is two effectively duplicate requests for one chunk. To avoid
this we add a new getChunkIfLoaded method and make use of it in high
traffic methods.
Don't check unload queue before ticking things anymore.

In commits 71a238ee and c8591397 we added checks while ticking to ensure
we never ticked anything in a chunk meant to be unloaded. We did this to
prevent these chunks being removed from the unload queue and leaked.
However, this causes a ridiculously large number of lookups on the queue
for a somewhat rare occurance. We also now have the chunk GC which will
take care of these leaked chunks when they do happen. With this in mind
we now remove these checks which removes almost all uses of the
LongHashSet backing the unload queue.
Don't try to light chunk repeatedly when we aren't able to do so.

When a chunk is loaded the server tries to ensure it has its initial light
calculations done before sending it to the player. In order to do this
the server requires the chunks bordering this chunk be loaded as well. This
means chunks on the edge of a player's view distance will fail to light and
then try again every tick even though nothing has changed. The lookups to
see if lighting should be performed account for one third of all calls to
World.isChunkLoaded in a test setup. To reduce this cost we only attempt
to light again if the number of chunks loaded in the world has changed.
In testing this cuts chunk lighting calls to isChunkLoaded down to 1/300th
of their original total.