Previously, when re-adding a layer to its map, the layer would be removed from the map only to be immediately added back. This prevents the browser from efficiently updating the display. Now we do the minimal amount of work, while still guaranteeing that layers appear in the order they were added.
If an event listener is removed during an event dispatch, it shouldn't receive the active event. So now in addition to storing a defensive copy, we use a wrapper object for the event handler to store an `on` boolean. This is set to false when the listener is removed, preventing that handler from receiving the current event.
Now, when the location.hash changes, the map center and zoom will change accordingly. This is particularly nice for pasting in a URL that only differs by hash. Also, the hash control now ignores the hash if any part of it isNaN, or if it contains fewer than three components.