interp: feat: deep chaining iteration interp: test: add a testcase for deep chaining
interp: feat: deep chaining iteration
interp: test: add a testcase for deep chaining

deep chaining is to let user make a nested chain container to reuse
a chaining info which was already defined somewhere.

simply, if you make a chain that is holding another chain as internal
container then it becomes a deep chain.

e.g.
    chainA ---> chainB ---> X(== nullptr)
      |           |
     arrA        arrB

this is normal chain. however, if you have a chain like following next,

    chainC ---> chainD ---> chain E ---> X
      |           |
     arrC        arrD

you can reuse it by containing it as a container of new chain object.

    chainDeep1 ---> chainB ---> X
       |              |
       |             arrB
       |
     chainC ---> chainD
        |          |
       arrC       arrD

in above scenario, begin() iterator from chainDeep1 will iterates to

        "arrC --> arrD --> arrB"

sequence.
deep chaining can be simple implemented by letting its _arr to point a
chain object instead of arr container one.
however problem is, user sometimes hard to notice what their container
binder is referencing.
to help them, a chain provides two wrap() funcs.
    wrap(): just wrapping if it's not a chain object.
    wrapDeep(): wrap container no matter whether it's a chain or not.
                in consequence, it becomes deep chaining.

kniz/World,kniz/World