Prevent more unnecessary float boxing, especially in `if` and `match`

This patch prevents unnecessary boxing in more language constructs.  Especially important are `if` and `match` blocks, for example:

```ocaml
let reduce dir price ~by =
  match dir with
  | Buy -> price -. by
  | Sell -> price +. by
```

All OCaml tests passed.  The test code that shows that the extra allocations are gone is here:

> https://github.com/vbrankov/ocaml-demos/blob/master/unnecessary-boxing/test.ml