Is there a reason why handler functions are added differently from custom driver functions?
Handlers are callback handlers that work on application level. Drivers work on data level. What does this mean?

app.handlers also work without having any data to work with. For drivers you will always need to add the driver to existing data in blender. For example an attribute on your object.

The app.driver_namespace contains some value modification functions you can use within your drivers. By itself it doesn't do a thing. It needs to be triggered by the animation system. 

def mul2(value): return value*2
bpy.app.driver_namespace['my_function'] = mul2


Now you can use this function inside a driver python expression

#my_function(var)