Reduce memory usage of Octree

+ Use integer indices instead of pointers for child-node links, as
  pointers are quite large on many 64-bit systems.

+ Use spans in a vector to hold node surface lists, instead of
  std::list.  This should also save a lot of memory (std::list isn't
  so memory efficient).

+ Generally clean up the code structure, moving all of the build-time
  methods into Octree::Builder, and splitting up the code into
  multiple files.

In addition to reducing memory usage, this generally speeds up
rendering, by up to 10% in some cases, especially in complex scenes.