Store points in octree rather than fixed size buckets

This should allow point display to adapt more gracefully to varying
point densities, as well as enabling efficient frustum culling and point
picking.

* Use an in-place sorting procedure using a new function multi_partition
  for partitioning points into child octree nodes.  Includes some unit
  tests for multi_partition.

* New header and source glutil.{h,cpp} for OpenGL convenience functions