implemented multi-process

each cell is a separate process for SPEED.
refactored step() a little

to enable better multi-pid support
full multi-process generations

spawn separate processes for counting neighbors and for updating each
generation. outputs kinda wonky. gotta fix the print_board functions
fully multi-process processing!!!
fix random number generator

it now seeds before starting. whew.
some restructuring and commenting
additional comment and restructuring of cell_state
more code restructure

 - added cell_pid argument to count_neighbors function to remove need to
   call Enum.at() to get that value.
 - comments, etc.
optimized count_neighbors a little

rather than maping through the neighbors, collecting state, then
counting up the state with Enum.count, just use Enum.reduce to collect
the state and count in a single loop.
some pretty dramatic refactoring of neighbors

 - rewrote entire coordinate translation system
 - fixed wrapping bug (was not properly wrapping)
 - simplified count_neighbors function
restructured count_neighbors a little

 - made do_count_neighbors function to pull some logic out.