Fs.Watchval config : 
  ?persistent:bool ->
  ?recursive:bool ->
  ?encoding:Js.String.t ->
  unit ->
  configthere is no need to accept listener, since we return a watcher back it can register event listener there . Currently we introduce a type string_buffer, for the filename, it will be Buffer when the encoding is `utf8. This is dependent type which can be tracked by GADT in some way, but to make things simple, let's just introduce an or type
val on : 
  [ `change of (string -> Node.string_buffer -> unit) Js.Fn.arity2
  | `error of unit Js.Fn.arity0 ] ->
  t ->
  tval on_ : 
  t ->
  [ `change of (string -> Node.string_buffer -> unit) Js.Fn.arity2
  | `error of unit Js.Fn.arity0 ] ->
  tval close : t -> unit