Improve UPnP support

This PR changes the UPnP code so it doesn't try to exactly match the `URN` used by a router, as there can be slight differences. Also, it renames `getStatusInfo` to `getExternalIPAddress`, and makes it correctly get the external IP address from the router.

The commit is pretty big, so I can split it up if you want.