Allow symbolic objectives to be passed directly to Problem.
Fixes #202.
Maybe the only thing to consider here is whether there is a better way to manage the API given you only need to pass in a single argument instead of both the objective and gradient functions.
We could do Problem.__init__(*args, ...) and then count the number of arguments so that you could skip the gradient function.
We could also make a second Problem as SymProblem that takes the new arguments.
Or do a Problem.from_symbolic() alternative initializer.
If I understand correctly: if the objective function is given symbolically you essentially want to move
obj, obj_grad = create_objective_function(....)
inside of Problem?