Yes, I've got something working now. Turns out I was targeting the wrong region (or a more specific region than was available). I was targeting eu-west-2a when I actually just needed eu-west-2. Then it wasn't hanging, it was timing out, and did so after 30 minutes or so. :/
Next question - there's an 'instanceRunning' waiter, is there an 'instanceConnectable' waiter yet? There's a github feature request for it, but that was 8 years ago. I wondered whether someone has implemented on in the meantime.