libmnflash: add mnflash_usb_custom_write_once()

... which does not retry writes, use that to send erase and execute
commands. Also added an extra sleep before sending the latter.

Retrying an erase or execute command may be dangerous or pointless - in the
erase case, the device may have started erasing and we won't get an answer in
time, pointless in the execute case, because the device may have execute the
reset, in which case we won't get an answer.

We need the extra delay before "execute" because "upload()" does not wait after
writing a page (it sleeps before writing it), thus we would send the execute
while the device is still writing the last page and we do not get an answer.
libmnflash: use _custom_writ_once() in the example too.

... same reasoning as for the execute command in the library.
libmnflash: allow redirecting library messages.

mnflash_set_message_log() and mnflash_set_error_log() can now be used
to intercept all messages in the library. Both take the address of a callback
function as argument which gets the error/output message for further processing
or printing.

This is useful if the library is integrated into a GUI application or a
background service.