lots of changes - optimisation and code cleanup

- replaced zoning optimisation algorithm with spatial hashing.
- optimised boidAgentState's "buildNearbyList" (which is by far the
main bottleneck) fairly heavily.
- optimised some vector calculations
- refactored bits of the code to make it more 'Pythonic'
- clarified module names, class names, and generally made naming
conventions and so one more consistent.
- ditched 3rd party 'benchmarker' class (discovered the built-in
cProfile, which is a million times better).