use dispatchTable for shape-vs-shape collision queries

As we get more Shape types the code that tries to navigate to the correct collision query code grows in complexity with O(N^2)... unless we use a dispatch table of pointers to functions.  Since we're going to add one or two new shapes and we were already at four distinct types, it was time to make the dispatch, so here it is.

BTW, the resulting code is about twice as fast as the old "if, elseif, elseif" tree, but that isn't very important because the actual collision checks are far more cumbersome than finding the correct function call.  The important thing is that the "if, else if, else if" tree no longer needs to be expanded and maintained.
This version of collideShapes() is much simpler than the old version and is where our complexity is reduced.  Instead we have to build the dispatch table in initDispatchTable() above and remember to call it before using the ShapeCollider.