Create mapstate.js and refactor map.js to use it

* mapstate.js serializes/deserializes map state to a URL query string
* State includes map center and zoom level, current OTM search, and whether you're in "Add Tree" mode
* Values from the URL are communicated via `stateChangeStream` and handled in map.js
* App state changes are recorded in the URL via `setZoomLatLng`, `setSearch`, and `setModeName` functions

Cleanup:
* Remove utility.js functions (integrated into mapState.js)
* Remove `ADD_TREE_URL_HASH` from settings.py and `addTreeUrlHash` from settings.js

Also simplify/clarify stream logic in map.js:
* Eliminate single-use Bacon streams. Fewer named streams makes the logic easier to understand.
* For clarity, use Bacon.mergeAll to merge two streams. To me it's clearer this way when you're also doing something to one or more of the streams.
* Reorder code in init() so first we set up all streams and event handlers, and second we init everything

Also change inlineEditForm's inEditModeProperty to not fire an initial value
* Simplifies initialization in map.js
* Simplifies plot.js
Use third-party `History` module for "pushState" etc. capabilities on IE9

* Comes from https://github.com/browserstate/history.js
* Eliminate `U.pushState`
* On plot detail page, toggling edit mode does `replaceState` instead of `pushState` so we don't build up useless history
Clean up from merge, and respond to feedback.

This commit should be squashed, but it required reordering and had dozens of conflicts. So I'm letting it stand.

Respond to feedback.
Merge pull request #825 from RickMohr/map-state

Map state