<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def send_script_async(self, conn_id, data, progress_callback, callback):
 """Asynchronously send a script to the device."""


        def monitor_callback(_conn_string, _conn_id, _event_name, event):
            if event.get('operation') != 'script':
                return

            progress_callback(event.get('finished'), event.get('total'))

        async def _install_monitor():
            try:
                conn_string = self._adapter._get_property(conn_id, 'connection_string')
                return self._adapter.register_monitor([conn_string], ['progress'], monitor_callback)
            except:  #pylint:disable=bare-except;This is a legacy shim that must always ensure it doesn't raise.
                self._logger.exception("Error installing script progress monitor")
                return None

        monitor_id = self._loop.run_coroutine(_install_monitor())
        if monitor_id is None:
            callback(conn_id, self.id, False, 'could not install progress monitor')
            return

        future = self._loop.launch_coroutine(self._adapter.send_script(conn_id, data))
        future.add_done_callback(lambda x: self._callback_future(conn_id, x, callback, monitors=[monitor_id]))