Tag synthetic unit with attachment

This makes it easy to differentiate unit inserted by a compiler vs unit
written by the user. Useful for quasiquotes and pretty printing.

Additionally SyntacticBlock extractor is changed to treat EmptyTree as
zero-element block.
Refactor reification of high-cardinality holes

New approach makes iterated function much more clear through aggressive
code reuse, recursion and large descriptive comment on top of it.
SI-7275 allow flattenning of blocks with ..$

This commit extends current splicing rules to allow flattening of
trees into other trees.

Without such support it is impossible to correctly create vals with
patterns and use it in other location as they could expand into
multiple-statement blocks:

    scala> q"val (a, b) = (1, 2)"
    res0: reflect.runtime.universe.Tree =
    {
      <synthetic> <artifact> private[this] val x$1 = scala.Tuple2(1, 2):
    @scala.unchecked match {
        case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b)
      };
      val a = x$1._1;
      val b = x$1._2;
      ()
    }

    scala> q"..$res0; println(a + b)"
    res1: reflect.runtime.universe.Tree =
    {
      <synthetic> <artifact> private[this] val x$1 = scala.Tuple2(1, 2):
    @scala.unchecked match {
        case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b)
      };
      val a = x$1._1;
      val b = x$1._2;
      println(a.$plus(b))
    }