Add tunnel timeout support.
Use result `job_id` instead of parsing the `url` and ensure tunnel can restart if the tunnel failed to start.