[Enhancement] tweaks for better error handling (#5)

diff --git a/src/plugins/HttpPlugin.ts b/src/plugins/HttpPlugin.ts
index 3b5b171..3d8f569 100644
--- a/src/plugins/HttpPlugin.ts
+++ b/src/plugins/HttpPlugin.ts
@@ -60,44 +60,49 @@
               };
         const operation = pathname.replace(/\?.*$/g, '');
 
-        const [span, request]: [Span, ClientRequest] = ContextManager.withSpanNoStop(
-            ContextManager.current.newExitSpan(operation, host), (_span: Span, args) => {
+        let stopped = 0;  // compensating if request aborted right after creation 'close' is not emitted
+        const span = ContextManager.current.newExitSpan(operation, host).start();
+        const stopIfNotStopped = () => !stopped++ ? span.stop() : null;  // make sure we stop only once
 
-          _span.component = Component.HTTP;
-          _span.layer = SpanLayer.HTTP;
-          _span.tag(Tag.httpURL(host + pathname));
+        try {
+          span.component = Component.HTTP;
+          span.layer = SpanLayer.HTTP;
+          span.tag(Tag.httpURL(host + pathname));
 
-          const _request = original.apply(this, args);
+          const request: ClientRequest = original.apply(this, arguments);
 
-          _span.extract().items.forEach((item) => {
-            _request.setHeader(item.key, item.value);
+          span.extract().items.forEach((item) => {
+            request.setHeader(item.key, item.value);
           });
 
-          return [_span, _request];
+          request.on('close', stopIfNotStopped);
+          request.on('abort', () => (span.errored = true, stopIfNotStopped()));
+          request.on('error', (err) => (span.error(err), stopIfNotStopped()));
 
-        }, arguments);
+          request.prependListener('response', (res) => {
+            span.resync();
+            span.tag(Tag.httpStatusCode(res.statusCode));
+            if (res.statusCode && res.statusCode >= 400) {
+              span.errored = true;
+            }
+            if (res.statusMessage) {
+              span.tag(Tag.httpStatusMsg(res.statusMessage));
+            }
+            stopIfNotStopped();
+          });
 
-        span.async();
+          span.async();
 
-        let stopped = 0;  // compensating if request aborted right after creation 'close' is not emitted
-        const stopIfNotStopped = () => !stopped++ ? span.stop() : null;  // make sure we stop only once
-        request.on('close', stopIfNotStopped);
-        request.on('abort', () => (span.errored = true, stopIfNotStopped()));
-        request.on('error', (err) => (span.error(err), stopIfNotStopped()));
+          return request;
 
-        request.prependListener('response', (res) => {
-          span.resync();
-          span.tag(Tag.httpStatusCode(res.statusCode));
-          if (res.statusCode && res.statusCode >= 400) {
-            span.errored = true;
+        } catch (e) {
+          if (!stopped) {
+            span.error(e);
+            stopIfNotStopped();
           }
-          if (res.statusMessage) {
-            span.tag(Tag.httpStatusMsg(res.statusMessage));
-          }
-          stopIfNotStopped();
-        });
 
-        return request;
+          throw e;
+        }
       };
     })(http.request);
   }
@@ -122,10 +127,9 @@
 
         const carrier = ContextCarrier.from(headersMap);
         const operation = (req.url || '/').replace(/\?.*/g, '');
+        const span = ContextManager.current.newEntrySpan(operation, carrier);
 
-        return ContextManager.withSpan(ContextManager.current.newEntrySpan(operation, carrier),
-            (span, self, args) => {
-
+        return ContextManager.withSpan(span, (self, args) => {
           span.component = Component.HTTP_SERVER;
           span.layer = SpanLayer.HTTP;
           span.tag(Tag.httpURL((req.headers.host || '') + req.url));
diff --git a/src/trace/context/ContextManager.ts b/src/trace/context/ContextManager.ts
index 7f373a6..6fd34e6 100644
--- a/src/trace/context/ContextManager.ts
+++ b/src/trace/context/ContextManager.ts
@@ -68,7 +68,7 @@
       span.start();
 
     try {
-      return callback(span, ...args);
+      return callback(...args);
     } catch (e) {
       span.error(e);
       throw e;
@@ -82,7 +82,7 @@
       span.start();
 
     try {
-      return await callback(span, ...args);
+      return await callback(...args);
     } catch (e) {
       span.error(e);
       throw e;
@@ -90,19 +90,6 @@
       span.stop();
     }
   }
-
-  withSpanNoStop(span: Span, callback: (...args: any[]) => any, ...args: any[]): any {
-    if(!span.startTime)
-      span.start();
-
-    try {
-      return callback(span, ...args);
-    } catch (e) {
-      span.error(e);
-      span.stop();
-      throw e;
-    }
-  }
 }
 
 export default new ContextManager();