Ignore already received replies for same shards

It is possible to get a reply for same shard
from different node sent before its collector
get stopped in remove_overlapping_shards.

This running condition leads to a possibility
of same info to be aggregated multiple times.
diff --git a/src/fabric_group_info.erl b/src/fabric_group_info.erl
index 24232a8..f6ed9cb 100644
--- a/src/fabric_group_info.erl
+++ b/src/fabric_group_info.erl
@@ -58,17 +58,23 @@
     end;
 
 handle_message({ok, Info}, Shard, {Counters0, Acc, Ushards}) ->
-    NewAcc = append_result(Info, Shard, Acc, Ushards),
-    Counters1 = fabric_dict:store(Shard, ok, Counters0),
-    Counters = fabric_view:remove_overlapping_shards(Shard, Counters1),
-    case is_complete(Counters) of
-    false ->
-        {ok, {Counters, NewAcc, Ushards}};
-    true ->
-        Pending = aggregate_pending(NewAcc),
-        Infos = get_infos(NewAcc),
-        Results = [{updates_pending, {Pending}} | merge_results(Infos)],
-        {stop, Results}
+    case fabric_dict:lookup_element(Shard, Counters0) of
+    undefined ->
+        % already heard from other node in this range
+        {ok, {Counters0, Acc, Ushards}};
+    nil ->
+        NewAcc = append_result(Info, Shard, Acc, Ushards),
+        Counters1 = fabric_dict:store(Shard, ok, Counters0),
+        Counters = fabric_view:remove_overlapping_shards(Shard, Counters1),
+        case is_complete(Counters) of
+        false ->
+            {ok, {Counters, NewAcc, Ushards}};
+        true ->
+            Pending = aggregate_pending(NewAcc),
+            Infos = get_infos(NewAcc),
+            Results = [{updates_pending, {Pending}} | merge_results(Infos)],
+            {stop, Results}
+        end
     end;
 handle_message(_, _, Acc) ->
     {ok, Acc}.