If all you want is to send Waze a destination (starting it if necessary), you can simply open a "geo:" URI. Waze registers to handle these.
Note that e.g. Google Maps will register for this intent too, so if you want to ensure Waze handles it you need to send it to the "com.waze" package.
So that makes it an intent with these parameters:
Action: "android.intent.action.VIEW" (aka android.content.Intent.ACTION_VIEW)
Data: "geo:<latitude>,<longitude>" / "geo:?q=some+address" or even "geo:?q=name+of+location" (but that last one tends to require the user to manually select e.g. Google search results if it's not a location Waze knows "natively")
(Start as an activity)This post
also hints at a "waze" intent that the widget uses, but I don't know the syntax of that one.
As an aside, I've found this quite handy when combined with an automation app like Llama (there are also Tasker, Locale and probably others) that can send arbitrary intents when predefined condtions are met.
(For example: something like "if the bluetooth device in my car connects on $days_of_week between $times, start Waze with $destination" is quite handy before Waze has learned your regular routine)
Bonus: you can have the same condition enable GPS and mobile data so you don't have to have them on all the time.