Control-flow graph for a single procedure (as opposed to cfg.ml, which represents a cfg for a file). Defines useful wrappers that allows us to do tricks like turn a forward cfg to into a backward one, or view a cfg as having a single instruction per block

`module type Node : sig ... end`
`module type S : sig ... end`
`module DefaultNode : Node with type t = InferIR.Procdesc.Node.t and type id = InferIR.Procdesc.Node.id`
`module InstrNode : sig ... end`
`module Normal : S with type t = InferIR.Procdesc.t and module Node = DefaultNode and type instrs_dir = InferIR.Instrs.not_reversed`

Forward CFG with no exceptional control-flow

`module Exceptional : S with type t = InferIR.Procdesc.t * DefaultNode.t list InferIR.Procdesc.IdMap.t and module Node = DefaultNode and type instrs_dir = InferIR.Instrs.not_reversed`

Forward CFG with exceptional control-flow

`module Backward : functor (Base : S with type instrs_dir = InferIR.Instrs.not_reversed) -> S with type t = Base.t and module Node = Base.Node and type instrs_dir = InferIR.Instrs.reversed`

Wrapper that reverses the direction of the CFG

`module OneInstrPerNode : functor (Base : S with module Node = DefaultNode) -> sig ... end`
`module NormalOneInstrPerNode : module type of sig ... end`