drm/nouveau/gpio: reimplement as nouveau_gpio.c, fixing a number of issues