Add addAll method to HLL & HLL++

- addAll is similar to Set.addAll. It performs a mutable union. The current
  HLL(++) is modified, the elements of the other HLL(++) are added to the
  current HLL(++). Other is never modified.
  We cannot reuse the merge name since it would break compatibility.

- Updated merge to have a consistent behavior. A new HLL(++) is always created.
  Nor this nor the estimators are ever modified. The issues were that:

    - this was returned when estimators was null or empty. This is an unsafe
      behavior. It could easily lead to corruption since the user has now way
      to know if it is safe to modify the returned instance of not.

    - The HLL++ implementation was modifying this. This behavior is not
      consistent with HLL and is unsafe.

    - The HLL++ implementation was converting estimators to normal mode
      is this is in normal mode. This can be avoided, and is costly both
      in time and memory
Ensure that all the cardinality estimator follows the same merge semantics

- A new estimator is always created
- This and estimators are never modified
Faster addAll when other is in sparse mode.

addAll is much faster in sparse mode since only existing indexes have to be
updated. We can be smarter than creating a copy of other and converting it
to normal mode when other is in smart mode. We can traverse the other sparseSet
and only update relevant index.

This patch speed up scenario when lot of small cardinalities HLL++ are
aggregated into more coarse grained buckets.
Merge branch 'cleaner_merge' of https://github.com/cykl/stream-lib into cykl-cleaner_merge