recursively walk a directory and execute a callback