Starts the run loop and manages exceptions and cleanup.

async def run_async(self):
        """
        Starts the run loop and manages exceptions and cleanup.
        """
        try:
            await self.run_loop_async()
        except Exception as err:  # pylint: disable=broad-except
            _logger.error("Run loop failed %r", err)

        try:
            _logger.info("Shutting down all pumps %r", self.host.guid)
            await self.remove_all_pumps_async("Shutdown")
        except Exception as err:  # pylint: disable=broad-except
            raise Exception("Failed to remove all pumps {!r}".format(err))