Replaces HasEntered() with Crossed() and reduces redundant checks on turf/Enter()

In an effort to reduce redundant code in object movement two changes have been made:
* atom/HasEntered() is replaced with atom/movable/Crossed(), a byond builtin that is already being called from standard Move() code
* During turf/Enter(), the contents of the tiles are checked only once, using a temporary list to cut down on redundant checks.

This should reduce lag a bit when lots of objects are moving on top of lots of other objects (singulo, mining)

Also I dunno if the whole pushing people into walls trick was ever fixed but this should fix it if not, turf/Enter() allowed things to enter unconditionally if they were not on a turf (before checking their own density even).  I see that bug with sayustation cluster grenades, when they step out of a closet they go through walls easily (allowing you to get parrots into all sorts of places)