Hex utils refactor

Before this branch a significant amount of code was written within the `board_types` module to convert between various coordinate systems for a hexagonal grid.

This branch moves this code to it's own module, provides better documentation, a more complete implementation of the functions to convert between the various coordinate types, and leaves a place for more hexagon utility functions.

Since the `StandardBoardType` is a straightforward mapping of ordinals to hexagons and back, similar to those refactored into `hex_utils`, the code used to compute this can be offloaded almost entirely to the `hex_utils` module.

The caching is left in `board_types`, rather than in `hex_utils` so that the functions in `hex_utils` can stay pure. As a library, it should be further optimized, though.