Change behavior of internal disconnect handling

socket is not set to nil until the socket itself informs us it has
disconnected

additionally, any tasks that require to be ran after disconnect occurs,
is now set inside of a block instead of being called inline

also fixes issue with non-GCD socket never informing IRC client it
disconnected