Exceptions when task is pending is vague and unhandleable
**Describe the bug**
Using the funcx client's `client.get_result(<task_uuid>)` returns a naked `Exception` with a message in it when the task is pending. Due to this exception not being typed better, it is very difficult to programmatically handle this. 

**To Reproduce**
Steps to reproduce the behavior, for e.g:
1. Run a slow function
2. Do `funcx_client.get_result(<task_uuid_of_slow_function>)`
3. Get the `Exception('waiting-for-ep')` exception
4. Be annoyed because a try block cannot differentiate this from an arbitrary exception

**Expected behavior**
The client should raise a clearly typed exception, say, `funcx.sdk.errors.TaskPending` or `TaskNotComplete`

diff --git a/funcx_sdk/funcx/sdk/client.py b/funcx_sdk/funcx/sdk/client.py
index ab24608b..03b6f6a1 100644
--- a/funcx_sdk/funcx/sdk/client.py
+++ b/funcx_sdk/funcx/sdk/client.py
@@ -14,7 +14,7 @@ from funcx.serialize import FuncXSerializer
 # from funcx.sdk.utils.futures import FuncXFuture
 from funcx.sdk.error_handling_client import FuncXErrorHandlingClient
 from funcx.sdk.utils.batch import Batch
-from funcx.utils.errors import FailureResponse, VersionMismatch, SerializationError
+from funcx.utils.errors import FailureResponse, VersionMismatch, SerializationError, TaskPending
 from funcx.utils.handle_service_response import handle_response_errors
 
 try:
@@ -249,7 +249,7 @@ class FuncXClient(FuncXErrorHandlingClient):
         """
         task = self.get_task(task_id)
         if task['pending'] is True:
-            raise Exception(task['status'])
+            raise TaskPending(task['status'])
         else:
             if 'result' in task:
                 return task['result']
diff --git a/funcx_sdk/funcx/utils/errors.py b/funcx_sdk/funcx/utils/errors.py
index 77a3857d..75967ed2 100644
--- a/funcx_sdk/funcx/utils/errors.py
+++ b/funcx_sdk/funcx/utils/errors.py
@@ -111,3 +111,14 @@ class InvalidScopeException(FuncxError):
 
     def __repr__(self):
         return "Invalid Scope: {}".format(self.message)
+
+
+class TaskPending(FuncxError):
+    """Task is pending and no result is available yet
+    """
+
+    def __init__(self, reason):
+        self.reason = reason
+
+    def __repr__(self):
+        return "Task is pending due to {self.reason}"
['funcx_sdk/funcx/sdk/client.py', 'funcx_sdk/funcx/utils/errors.py']