#### ALL software version info (bokeh, python, notebook, OS, browser, any other …relevant packages)
I'm using Bokeh 2.3.0 and python 3.6.8.
#### Description of expected behavior and the observed behavior
Errors are being raised after events when a figure uses both an edit tool and `.on_event()`. I first noticed this trying to create a figure with `.on_event(Tap,)` and a `BoxEditTool` but I see similar errors when replacing `Tap` with other events, or using other edit tools like `PointDrawTool`. Expected behavior is that the function you point to with `.on_event()` is called without any errors raised.
#### Complete, minimal, self-contained example code that reproduces the issue
To be used with `bokeh serve`:
```
from bokeh.io import curdoc
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, BoxEditTool
from bokeh.events import Tap
def tap_event(tap):
print('tap at', tap.x, tap.y)
plot = figure(plot_width=300, plot_height=300)
cds = ColumnDataSource(data=dict(x=[], y=[], width=[], height=[]))
rect = plot.rect('x', 'y', 'width', 'height', source=cds)
plot.add_tools(BoxEditTool(renderers=[rect]))
plot.on_event(Tap, tap_event)
data_cds = ColumnDataSource(data=dict(x=[1, 2, 3], y=[1, 2, 3]))
plot.scatter(x='x', y='y', source=data_cds)
curdoc().add_root(plot)
```
#### Stack traceback and/or browser JavaScript console output
When I tap on the figure I get:
```
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/bokeh/server/protocol_handler.py", line 90, in handle
work = await handler(message, connection)
File "/usr/local/lib/python3.6/site-packages/bokeh/server/session.py", line 67, in _needs_document_lock_wrapper
result = func(self, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/bokeh/server/session.py", line 261, in _handle_patch
message.apply_to_document(self.document, self)
File "/usr/local/lib/python3.6/site-packages/bokeh/protocol/messages/patch_doc.py", line 100, in apply_to_document
doc._with_self_as_curdoc(lambda: doc.apply_json_patch(self.content, setter))
File "/usr/local/lib/python3.6/site-packages/bokeh/document/document.py", line 1198, in _with_self_as_curdoc
return f()
File "/usr/local/lib/python3.6/site-packages/bokeh/protocol/messages/patch_doc.py", line 100, in <lambda>
doc._with_self_as_curdoc(lambda: doc.apply_json_patch(self.content, setter))
File "/usr/local/lib/python3.6/site-packages/bokeh/document/document.py", line 394, in apply_json_patch
initialize_references_json(references_json, references, setter)
File "/usr/local/lib/python3.6/site-packages/bokeh/document/util.py", line 88, in initialize_references_json
instance.update_from_json(obj_attrs, models=references, setter=setter)
File "/usr/local/lib/python3.6/site-packages/bokeh/core/has_props.py", line 469, in update_from_json
self.set_from_json(k, v, models, setter)
File "/usr/local/lib/python3.6/site-packages/bokeh/core/has_props.py", line 411, in set_from_json
descriptor.set_from_json(self, json, models, setter)
File "/usr/local/lib/python3.6/site-packages/bokeh/core/property/descriptors.py", line 623, in set_from_json
return super().set_from_json(obj, self.property.from_json(json, models), models, setter)
File "/usr/local/lib/python3.6/site-packages/bokeh/core/property/descriptors.py", line 327, in set_from_json
self._internal_set(obj, json, setter=setter)
File "/usr/local/lib/python3.6/site-packages/bokeh/core/property/descriptors.py", line 784, in _internal_set
value = self.property.prepare_value(obj, self.name, value)
File "/usr/local/lib/python3.6/site-packages/bokeh/core/property/bases.py", line 350, in prepare_value
raise ValueError(f"failed to validate {obj_repr}.{name}: {error}")
ValueError: failed to validate BoxEditTool(id='1039', ...).custom_icon: invalid value: None; allowed values are string filenames, PIL.Image.Image instances, or RGB(A) NumPy arrays
```