To further clarify: If I re-install the default table rate shipping module then checkout_shipping.php correctly displays the default table rate and my own geographically-specific table rate. If I select the default rate, I can continue to the payment page. If I select the geographically-specific one then I am stuck in the checkout_shipping page.
I have checked that the two modules differ only in the names e.g. table becomes pf_1, TABLE becomes PF_1 etc.
I have tried applying the same geographical restriction to the default table rate. It still works for the default, not for my own.
BREAKTHROUGH!!! I had named my shipping modules pf_1, pf_2, pf_3 etc
Discovered you cannot use underscore character in names of shipping modules as it is used in some other manner in shipping.php