Track client pid in ets table

We need the client pid in order to respond to clients when the worker
crashes.

BugzID: 12344
diff --git a/src/rexi_server.erl b/src/rexi_server.erl
index 931e340..aa417aa 100644
--- a/src/rexi_server.erl
+++ b/src/rexi_server.erl
@@ -25,7 +25,8 @@
 -record(job, {
     client::reference(),
     worker::reference(),
-    pid::pid()
+    client_pid::pid(),
+    worker_pid::pid()
 }).
 
 -record(st, {
@@ -68,15 +69,20 @@
 handle_cast({doit, From, MFA}, St) ->
     handle_cast({doit, From, undefined, MFA}, St);
 
-handle_cast({doit, From, Nonce, MFA}, State) ->
+handle_cast({doit, {ClientPid, ClientRef} = From, Nonce, MFA}, State) ->
     {LocalPid, Ref} = spawn_monitor(?MODULE, init_p, [From, MFA, Nonce]),
-    Job = #job{client = element(2, From), worker = Ref, pid = LocalPid},
+    Job = #job{
+        client = ClientRef,
+        worker = Ref,
+        client_pid = ClientPid,
+        worker_pid = LocalPid
+    },
     {noreply, add_job(Job, State)};
 
 
 handle_cast({kill, FromRef}, #st{clients = Clients} = St) ->
     case find_worker(FromRef, Clients) of
-    #job{worker = KeyRef, pid = Pid} = Job ->
+    #job{worker = KeyRef, worker_pid = Pid} = Job ->
         erlang:demonitor(KeyRef),
         exit(Pid, kill),
         {noreply, remove_job(Job, St)};
@@ -98,13 +104,13 @@
 
 handle_info({'DOWN', Ref, process, Pid, Error}, #st{workers=Workers} = St) ->
     case find_worker(Ref, Workers) of
-    #job{pid=Pid, worker=Ref, client=From} = Job ->
+    #job{worker_pid=Pid, worker=Ref, client_pid=CPid, client=CRef} =Job ->
         case Error of #error{reason = {_Class, Reason}, stack = Stack} ->
-            notify_caller(From, {Reason, Stack}),
+            notify_caller({CPid, CRef}, {Reason, Stack}),
             St1 = save_error(Error, St),
             {noreply, remove_job(Job, St1)};
         _ ->
-            notify_caller(From, Error),
+            notify_caller({CPid, CRef}, Error),
             {noreply, remove_job(Job, St)}
         end;
     false ->
@@ -115,15 +121,16 @@
     {noreply, St}.
 
 terminate(_Reason, St) ->
-    ets:foldl(fun(#job{pid=Pid},_) -> exit(Pid,kill) end, nil, St#st.workers),
+    ets:foldl(fun(#job{worker_pid=Pid},_) -> exit(Pid,kill) end, nil,
+        St#st.workers),
     ok.
 
 code_change(_OldVsn, {st, Workers}, _Extra) ->
     {ok, #st{workers = Workers}};
 
 code_change(_OldVsn, {st, Workers0, Errors, Limit, Count}, _Extra) ->
-    Jobs = [#job{pid=A, worker=B, client=C} || {A, B, {_, C}}
-        <- ets:tab2list(Workers0)],
+    Jobs = [#job{worker_pid=A, worker=B, client_pid=C, client=D}
+        || {A, B, {C, D}} <- ets:tab2list(Workers0)],
     ets:delete(Workers0),
     State = #st{errors = Errors, error_limit = Limit, error_count = Count},
     ets:insert(State#st.workers, Jobs),