Replace root logger w/ module logger in crimedb.osm
bin/runtests: Add driver script for Python unittests
bin/render: Add 'grid2' command to generate global grid

- Add new 'grid2' command to generate grid tiles useful for incremental
  loading / rendering a map. The current CrimeDB LefaletJS plugin must
  be configured with a region and loads all data for that region at
  once, and so is not suitable for general-purpose mapping. The grid2
  command emits GeoJSON files using the Slippy map coordinate system of
  z/x/z to name them.
- No support in www/js/* yet for using these files.
bin/update: Use getopt to select phases
bin/httpd: Run under sudo

- Since our httpd.conf binds to port 80, this always needs to run as
  root. Previously we assumed that the caller was running us under sudo,
  but why bother: just do it ourselves.
bin/render: Set max zoom level to 14
Re-write JavaScript rendering of crime grid

- Use pre-generated GeoJSON tile files from 'bin/render grid2' to render
  the grid at various zoom levels
Perform JS map bounds check in renderTileData()

- Prior to this change, we were performing the map bounds check before
  fetching data, and then calling maybeRenderGrid() for each tile that
  we fetched. If all data was already cached, this would result in
  several calls to renderTileData(), each of which is relatively
  expensive and would pin the UI thread.