Make NoSolutionError constraints match format of input

When setting constraints, they are specified like `["package", "constraint"]`
However the NoSolutionError was outputing them as a string like `"(package constraint)"`
which makes it much harder to programmatically determine what constraints had no
solution. It makes sense to output that in the same format as inputted.