## AIR trace handler

This crate contains implementation of the CRDT-based merging data algorithm. It exposes the `TraceHandler` struct that based on the visitor pattern and has public methods that should be called in certain places of AIR instructions execution. Internally `TraceHandler` contains several FSM and each of such public methods does state transitioning of one or more these FSMs. Below are state transition sequences for all instructions that caller must follow.

### Ap instruction

Expected sequence of `TraceHandler` calls for the `ap` instruction:
```
meet_ap_start
    -> meet_ap_end
```

### Call instruction

Expected sequence of `TraceHandler` calls for the `call` instruction:
```
meet_call_start
    -> meet_call_end
```

### Par instruction

Expected sequence of `TraceHandler` calls for the `par` instruction: 
```
meet_par_start
    -> meet_par_subgraph_end(..., SubgraphType::Left)
    -> meet_par_subgraph_end(..., SubgraphType::Right)
```

### Fold instruction

Expected sequence of `TraceHandler` calls for the `fold` instruction:
```
meet_fold_start.1 ->
    meet_generation_start.N ->
        meet_next.M ->
        meet_prev.M ->
    meet_generation_end.N ->
meet_fold_end.1
```
where .T means that this function should be called exactly T times.
