Replace FullSync algorithm and fix bugs to lower delay and overhead

1) During high update frequency PSync nodes can send data that contain
nothing new. This blocks the receiver nodes from syncing leading to
high delays. To fix this, Sync interests now include the cumulative number
of elements inserted into the IBF. This is used as an heuristic to guide
PSync on decode failures to minimize the chance of sending of such data
packets. Sync data freshness for entire dataset is also reduced.
If a no new update still happens, introduce some safeguards in the code.

2) Fast reaction upon negative set being detected is introduced. Timed
processing for interests is also introduced.

3) Fix satisfyPendingInterests to send the new update on publish even if
pending IBF decode fails, since we have something to send.

4) For interests which request segments, only respond with segments already contained
in in-memory storage.

refs: [solution II] in Thesis:
"Improvements to PSync: Distributed Full Dataset Synchronization
in Named-Data Networking"
https://digitalcommons.memphis.edu/cgi/viewcontent.cgi?article=3162&context=etd

Change-Id: Ie235b4fb56fcb7de21068511205e407006292b23
diff --git a/examples/full-sync.cpp b/examples/full-sync.cpp
index 6248336..e202a83 100644
--- a/examples/full-sync.cpp
+++ b/examples/full-sync.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2023,  The University of Memphis
+ * Copyright (c) 2014-2024,  The University of Memphis
  *
  * This file is part of PSync.
  * See AUTHORS.md for complete list of PSync authors and contributors.
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU Lesser General Public License along with
  * PSync, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include <PSync/full-producer.hpp>
 
@@ -37,7 +37,7 @@
   /**
    * @brief Initialize producer and schedule updates.
    *
-   * Set IBF size as 80 expecting 80 updates to IBF in a sync cycle.
+   * Use default IBF size of 6 as we're expecting 6 updates to IBF in a sync cycle.
    * Set syncInterestLifetime and syncDataFreshness to 1.6 seconds.
    * userPrefix is the prefix string of user node prefixes.
    */
@@ -46,7 +46,6 @@
     : m_producer(m_face, m_keyChain, syncPrefix, [this] {
           psync::FullProducer::Options opts;
           opts.onUpdate = std::bind(&Producer::processSyncUpdate, this, _1);
-          opts.ibfCount = 80;
           opts.syncInterestLifetime = 1600_ms;
           opts.syncDataFreshness = 1600_ms;
           return opts;