ndn.cxx: Expressing interests and publishing data use event scheduling, instead of directly calling the callback

Also in this commit is extension, allowing expression of multiple
interests for the same name with different callbacks.  For example, if
user expresses two exactly the same interests, when data arrives or
interest times out, callbacks from the individual call will be invoked.

Another small change is that if interest is "collapsed" in ApiFace, it
is not further propagated to the NDN stack.
diff --git a/ndn.cxx/detail/pending-interests-container.h b/ndn.cxx/detail/pending-interests-container.h
index 4d96ed4..78ab10d 100644
--- a/ndn.cxx/detail/pending-interests-container.h
+++ b/ndn.cxx/detail/pending-interests-container.h
@@ -24,19 +24,19 @@
   PendingInterestEntry (Ptr<const Interest> interest)
     : m_interest (interest)
   { }
-  
+
   void
   AddCallbacks (ApiFace::DataCallback onData, ApiFace::TimeoutCallback onTimeout)
   { 
-    m_dataCallback = onData;
-    m_timeoutCallback = onTimeout;
+    m_dataCallbacks.push_back (onData);
+    m_timeoutCallbacks.push_back (onTimeout);
   }
 
   void
   ClearCallbacks ()
   {
-    m_dataCallback = ApiFace::DataCallback ();
-    m_timeoutCallback = ApiFace::TimeoutCallback ();
+    m_dataCallbacks.clear ();
+    m_timeoutCallbacks.clear ();
   }
 
   Ptr<const Interest>
@@ -44,10 +44,32 @@
   {
     return m_interest;
   }
+
+  void
+  ProcessOnData (Ptr<const Interest> interest, Ptr<const Data> data)
+  {
+    for (std::list<ApiFace::DataCallback>::iterator i = m_dataCallbacks.begin ();
+         i != m_dataCallbacks.end ();
+         i++)
+      {
+        (*i) (interest, data);
+      }
+  }
+
+  void
+  ProcessOnTimeout (Ptr<const Interest> interest)
+  {
+    for (std::list<ApiFace::TimeoutCallback>::iterator i = m_timeoutCallbacks.begin ();
+         i != m_timeoutCallbacks.end ();
+         i++)
+      {
+        (*i) (interest);
+      }
+  }
   
-public:
-  ApiFace::DataCallback m_dataCallback;
-  ApiFace::TimeoutCallback m_timeoutCallback;
+private:
+  std::list<ApiFace::DataCallback> m_dataCallbacks;
+  std::list<ApiFace::TimeoutCallback> m_timeoutCallbacks;
   Ptr<const Interest> m_interest;
 };