What's the difference between variable binding and assignment?

That’s a good way to think of it, like OCaml has 3 syntax’s for this:

(* This creates a new immutable binding *)
let a = 42
(* `a` cannot be changed, only re-bound like how Elixir does it *)

(* This creates a new mutable binding *)
let b = ref 42
(* It can be changed within its scope *)
let () = b := 21
(* The `:=` operator means `to change where the binding points to` in a sense,
    It returns empty tuple, so you can pattern match that as above, or ignore it.
    It is indeed made purposefully cumbersome to minimize its use. *)