Functorise library

Instead of the Dl.library value being global, the library user must now
create it by calling library_open. The resulting value can then be
passed in a module to Nvml.Make.

This allows a missing libnvidia-ml.so to be handled at runtime.

Signed-off-by: John Else <john.else@citrix.com>
Define module type Nvml.API for simpler first-class modules

Signed-off-by: John Else <john.else@citrix.com>