Set Multiple Target Objects Simultaneously
Something like this:

import bpy
from bpy.props import StringProperty

def apply_target(self, context):
    arm = context.active_object
    pbones = arm.pose.bones
    #update drivers
    for driver in arm.animation_data.drivers:
        for v in driver.driver.variables:
            for target in v.targets:
                target.id = bpy.data.objects[arm.my_target]
    #update contraints
    for bone in pbones:
        for constraint in bone.constraints:
            constraint.target = bpy.data.objects[arm.my_target]

class HelloWorldPanel(bpy.types.Panel):
    """Creates a Panel in the Object properties window"""
    bl_label = "Hello World Panel"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "object"

    @classmethod
    def poll(cls, context):
        return context.active_object is not None and context.active_object.type == "ARMATURE"

    def draw(self, context):
        layout = self.layout

        arm = context.active_object
        scene = context.scene

        row = layout.row()
        row.prop_search(arm, 'my_target', scene, 'objects')


def register():
    bpy.utils.register_module(__name__)
    bpy.types.Object.my_target = StringProperty(update=apply_target)


def unregister():
    bpy.utils.unregister_module(__name__)
    del bpy.types.Object.my_target

if __name__ == "__main__":
    register()