I'd say @ZargulTheWizard has summed it up pretty well. It's a very convenient way to manipulate limbs etc with few if any restrictions.
Everything is IK'd as normal but (as mentioned above in the comments) the target as selected in the IK's "Target" slot is your Empty. Dragging the Empty will force the bone to "look at", (track it), but ...
If you move the joint, bones have to stretch along their Y axis. This behaviour can be obtained with this setup, in which every deforming bone has one constraint to copy the location of a control bone and another constraint to stretch to the following control bone.
In pose mode, 3d viewport menu, you can find select->select pattern. This lets you select all bones by name. It's intended for use with a wildcard operator, for selecting all bones with a particular naming system (like *.L), but you can use it for selecting single bones. You can assign a hotkey to this menu item by right clicking on the menu item and ...
You need to manually paint weights values of 0-1 in weight-paint mode. There is no easy way to go about it besides the automatic-weights assignment which you'd already stated as invalid for this scenario. Additionally, make sure that your mesh has no double (overlapping) vertices.
I think this script should do what you want.
armatures = [o for o in bpy.context.scene.objects if o.type == "ARMATURE"]
# If you want to select only from selected armatures, use the next line instead.
# armatures = [o for o in bpy.context.selected_objects if o.type == "ARMATURE"]
selected_bones = bpy.context....