Performance Statistics gathering and reporting

`type perf_stats`````
`type stats_kind````=`

`|` `Time of Mtime_clock.counter * InferStdlib.IStd.Unix.process_times`
`|` `Memory`
`|` `TimeAndMemory`

``
`type stats_type````=`

`|` `ClangLinters of InferBase.SourceFile.t`
`|` `ClangFrontend of InferBase.SourceFile.t`
`|` `ClangFrontendLinters of InferBase.SourceFile.t`
`|` `JavaFrontend of InferBase.SourceFile.t`
`|` `PythonFrontend of InferBase.SourceFile.t`
`|` `TotalFrontend`
`|` `Backend of InferBase.SourceFile.t`
`|` `TotalBackend`
`|` `Reporting`
`|` `Driver`

``
`val from_json : Yojson.Basic.json ‑> perf_stats`
`val aggregate : perf_stats list ‑> Yojson.Basic.json`
`val register_report : stats_kind ‑> stats_type ‑> unit`

Register performance reporting function

`val get_reporter : stats_type ‑> unit ‑> unit`

Get reporting function that can be called at any time to create a performance report

`val register_report_at_exit : stats_type ‑> unit`

Create performance report when the current process terminates