core: compile all ports before creating the modem object

Before this, we only exported the modem to DBus when all ports were organized,
in order to make sure that we select as primary port the one we really want and
not the first AT port grabbed. Given that to get all the ports organized we also
needed to wait to get all the ports grabbed, we can now also defer the creation
of the modem object until all the ports get grabbed. This allows us to create
different types of objects based on the ports available (e.g. we can now create
QMI-supported modem objects if we see a QMI port around).
device: split `MMDevice' creation and plugin setting

We want to be able to create the MMDevice way before we have decided which
plugin to use.
device: keep sysfs path around for logging
device: load driver being used when first port grabbed
device: signal grabbed/released ports
plugin-base: don't assume a plugin will give as supported all ports of the device

E.g. the Generic plugin will give as unsupported 'net' ports found in the
device, as it doesn't know how to use them.
plugin-manager: new method to check support for a given device and all its ports

The new `mm_plugin_manager_find_device_support()' will be an async method which
waits for ports to be added in the given `MMDevice'. As soon as all added ports
are probed, the device support check is considered finished.
manager: use the new method to check support of a given full device
plugin-manager: define a minimum probing time of 2s

Effectively, we're now letting the kernel up to 2s to show all the ports of the
device, starting from the time where the first port is exposed.
plugin-manager: remove unneeded methods

We no longer need to query the plugin manager whether we're checking support for
a specific port, as the ports are now grabbed only once in the MMDevice, and
therefore we ensure that supports check is launched only once in the
PluginManager for that specific port.

Also, we no longer need to query the plugin manager whether we're checking
support for a given device, as the logic to check when all ports of the device
are probed is now maintained internally.
plugin-manager: find port support is now only an internal operation
plugin-manager: simplify device/port probing logic

The plugin manager no longer needs to take care of keeping track of which probes
are being run and to which physical device they correspond, as the upper layer's
`MMDevice' already does this. This simplifies the internal logic quite a lot, as
we can now easily suggest plugins to the remaining port probes of the same
device directly.
plugin-base: method to get device IDs doesn't need to be public

Given the new pre-probing filters, the IDs are no longer retrieved by the
plugins.
core: merge `MMPluginBase' and `MMPlugin'

There's no real point in maintaining a separate `MMPlugin' interface, as all the
plugins will inherit from `MMPluginBase', so just merge them and simplify
everything.
port-probe: rename _get_port() to _peek_port() as there is no ownership transfer
device: keep a list of port probes instead of just ports
port-probe: new method to check if there is an AT port in a list of probes
port-probe: use dispose() to cleanup internal object references
plugin: simplify interface by passing around the device and/or port objects
device: get vendor/product IDs

And don't do it in MMPlugin.