Update the swift code to use the split timeouts for receive and read.

Add a read timeout similar to the nifty code. There are now two
timeouts: the receive timeout which is the overall time that a client
is willing to wait for a response and the read timeout which is the
maximum time that the client will wait for the server to make
progress.

And a couple of fixes to ensure that null values for any of the
timeouts will not cause a NPE somewhere down the line.