What is the relationship between hook menu() and menu_link_save()?
They're slightly different concepts to be honest; the items defined in hook_menu() are saved in the menu_router table, while menu_link_save() saves items to the menu_links table.

They come together in menu_rebuild():


hook_menu() is invoked through the menu_router_build() function to get a list of router items
The router items are saved to the database using _menu_router_save()
The menu links are generated/updated using _menu_navigation_links_rebuild(); the menu router items are passed to this function to build the links.
Finally the caches are cleared.


There doesn't seem to be any way to pass custom data from the router items to the links I'm afraid, and I don't think hook_menu() supports the sort of hierarchy you're trying to build natively.