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.
We combine the two Shape::_type's to compute the index into the dispatch table.