gremlin-go: refactor writeLoop and readLoop using defer
diff --git a/gremlin-go/driver/gorillaTransporter.go b/gremlin-go/driver/gorillaTransporter.go
index cc033c8..2a209b4 100644
--- a/gremlin-go/driver/gorillaTransporter.go
+++ b/gremlin-go/driver/gorillaTransporter.go
@@ -142,16 +142,16 @@
 }
 
 func (transporter *gorillaTransporter) writeLoop() {
+	defer transporter.wg.Done()
+
 	ticker := time.NewTicker(transporter.connSettings.keepAliveInterval)
-	defer func() {
-		ticker.Stop()
-	}()
+	defer ticker.Stop()
+
 	for {
 		select {
 		case message, ok := <-transporter.writeChannel:
 			if !ok {
 				// Channel was closed, we can disconnect and exit.
-				transporter.wg.Done()
 				return
 			}
 
@@ -159,7 +159,6 @@
 			err := transporter.connection.SetWriteDeadline(time.Now().Add(transporter.connSettings.writeDeadline))
 			if err != nil {
 				transporter.logHandler.logf(Error, failedToSetWriteDeadline, err.Error())
-				transporter.wg.Done()
 				return
 			}
 
@@ -167,7 +166,6 @@
 			err = transporter.connection.WriteMessage(websocket.BinaryMessage, message)
 			if err != nil {
 				transporter.logHandler.logf(Error, failedToWriteMessage, "BinaryMessage", err.Error())
-				transporter.wg.Done()
 				return
 			}
 		case <-ticker.C:
@@ -175,7 +173,6 @@
 			err := transporter.connection.SetWriteDeadline(time.Now().Add(transporter.connSettings.keepAliveInterval))
 			if err != nil {
 				transporter.logHandler.logf(Error, failedToSetWriteDeadline, err.Error())
-				transporter.wg.Done()
 				return
 			}
 
@@ -183,7 +180,6 @@
 			err = transporter.connection.WriteMessage(websocket.PingMessage, nil)
 			if err != nil {
 				transporter.logHandler.logf(Error, failedToWriteMessage, "PingMessage", err.Error())
-				transporter.wg.Done()
 				return
 			}
 		}
diff --git a/gremlin-go/driver/protocol.go b/gremlin-go/driver/protocol.go
index b23f5d7..d07f231 100644
--- a/gremlin-go/driver/protocol.go
+++ b/gremlin-go/driver/protocol.go
@@ -52,13 +52,14 @@
 }
 
 func (protocol *gremlinServerWSProtocol) readLoop(resultSets *synchronizedMap, errorCallback func()) {
+	defer protocol.wg.Done()
+
 	for {
 		// Read from transport layer. If the channel is closed, this will error out and exit.
 		msg, err := protocol.transporter.Read()
 		protocol.mutex.Lock()
 		if protocol.closed {
 			protocol.mutex.Unlock()
-			protocol.wg.Done()
 			return
 		}
 		protocol.mutex.Unlock()
@@ -67,7 +68,6 @@
 			_ = protocol.transporter.Close()
 			protocol.logHandler.logf(Error, readLoopError, err.Error())
 			readErrorHandler(resultSets, errorCallback, err, protocol.logHandler)
-			protocol.wg.Done()
 			return
 		}
 
@@ -76,14 +76,12 @@
 		if err != nil {
 			protocol.logHandler.logf(Error, logErrorGeneric, "gremlinServerWSProtocol.readLoop()", err.Error())
 			readErrorHandler(resultSets, errorCallback, err, protocol.logHandler)
-			protocol.wg.Done()
 			return
 		}
 
 		err = protocol.responseHandler(resultSets, resp)
 		if err != nil {
 			readErrorHandler(resultSets, errorCallback, err, protocol.logHandler)
-			protocol.wg.Done()
 			return
 		}
 	}