My guess is that the 35 second delay is the timeout for a socket. Your first "hang" is likely a situation in which client.connected() returns true but isConnected is 0. In this case, neither condition in your loop() is satisfied, so nothing is printed. Then, after the socket times out, client.connected() returns 0 and you get the client.status = 0 messages. Note that the code prints "disconnect error!" when client.connected() returns false (implying that the connection was successfully closed). The case that you identify as "board crashed" is also likely a situation in which client.connected() returns true (as it would if client.status() were 23, which is SOCK_ESTABLISHED) but isConnected is 0. The second 35 second hang seems to be an attempt to connect that times out; this is not unusual (although it does beg the question of why the connection fails).
There seem to be two issues. One, the Client.connect() function appears to be returning 0 in cases in which the connection was successfully established (your last attempt). This is probably a bug in the library. The other is the failure to connect (your second attempt). This could be a bug in the library or simply a network failure or other error. But it seems like it would be good to limit the timeout.