Use `relnextIntersection` and `relprevIntersection` to improve data-based synthesis performance
After having completed #865 (closed) and #866 (closed), the performance of data-based synthesis can be further improved by using the specialized BDD operations relnextIntersection and relprevIntersection in CifBddEdge#apply. The relnextIntersection(states, relation, restriction, vars) operation computes and(relnext(states, relation, vars), restriction) as a single BDD operation, in a way that is more efficient than computing the relnext and and separately. And likewise for relprevIntersection. These BDD operations can therefre be used to compute relnext/relprev while imposing some restriction predicate.