What's the best way to build a GUI for non-blender users to control materials?
You can display any existing property in any place you want.
This means you can show properties of nodes, like the diffuse color or mix factor, in your own panel.

Example:

import bpy
from bpy.types import Panel

class ExamplePanel(Panel):
    bl_label = "Example Panel"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "render"

    def draw(self, context):
        layout = self.layout

        obj = context.active_object
        if not obj:
            layout.label("Select an object")
            return

        mat = obj.active_material
        if not mat:
            layout.label("Create a material")
            return

        nodes = mat.node_tree.nodes
        # Note: you will have to edit these node names to use the ones in your setup
        diffuse_1 = nodes["Diffuse BSDF"]
        diffuse_2 = nodes["Diffuse BSDF.001"]
        mix = nodes["Mix Shader"]

        layout.prop(diffuse_1.inputs["Color"], "default_value",
                    text="Color of first diffuse node")
        layout.prop(diffuse_2.inputs["Color"], "default_value",
                    text="Color of second diffuse node")
        layout.prop(mix.inputs["Fac"], "default_value",
                    text="Factor of mix node")


if __name__ == "__main__":  # only for live edit.
    from bpy.utils import register_class
    register_class(ExamplePanel)


To find the names of your nodes, open the right side panel in the node editor (shortcut N) and select the node:



Here you can see the new panel on the right, and the node editor on the bottom.