Replaces HasEntered() with Crossed() and adds border object list on turfs

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
* Movable atoms are placed in a border objects list in their turf if they have the ON_BORDER flag.  This list is checked instead of iterating through the contents when making sure you bump windows first.

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)