ENG-4568: Remove DevNullSnapshotTarget because it's not used anymore.

For sites that don't need to snapshot anything, no tasks will be created for
them.
ENG-4568: Add a helper class to encapsulate serialization of multiple snapshot
buffers to EE.
ENG-4568: Change ExecutionEngine.tableStreamSerializeMore() to accept multiple
output buffers.
ENG-4568: Add utility method to wrap a collection of listenable futures into
one.
ENG-4568: Fix RecoverySiteProcessor due to signature change of
tableStreamSerializeMore().
ENG-4568: Add a convenient method to put values into multimap.
ENG-4568: Change SnapshotPredicate interface to allow adding predicates after
construction.
ENG-4568: Refactor SnapshotSiteProcessor to allow multiple data targets per
snapshot.
ENG-4568: Change stream snapshot planning to allow multiple destinations for a
single source.
ENG-4568: Simplify SnapshotTableTask's constructor by passing the Table object
to it directly.
ENG-4568: Fix a bug in stream snapshot planning where it will delete all
snapshotted tuples. It should only perform deletion if it's used for migrating
partitioned table data.
ENG-4568: Fix a bug in stream snapshot planning where it mistakenly duplicated
tasks for each site as tasks for all sites.
ENG-4568: Fix an iteration error that forgot to increment the index in
SnapshotPredicates.
ENG-4568: Fix buffer allocation for multiple data targets in snapshot site
processor.
ENG-4568: Relax the parameter type of Cartographer.getReplicasForPartitions() to
Collection<Integer>.
ENG-4568: Add function zipToMap() to zip two lists into a multimap.
ENG-4568: Remove helper class SnapshotOutputBuffers and put the serialization
function in SnapshotUtil per Ariel's comment.
ENG-4568: Initialize the snapshot table stream write future list with an initial
size per Ariel's comment.
ENG-4568: Use Guava's Futures.allAsList() instead of reinventing the wheel per
Ariel's comment.
ENG-4568: Use Guava's multimap instead of reinventing the wheel as Ariel pointed
out.