Repository: bokeh/bokeh

Issue:
MultiSelect not rendering correctly if `options` is `list(dict)` 
From the sources of MultiSelect widget I see the possibility to provide `options` as:
`options = List(Either(String, Dict(String, String))`

But the HTML-output looks wrong:
SelectBox with `[object Object]`

Example showing the issue:

```
from bokeh.models.widgets import MultiSelect
from bokeh.io import show
from bokeh.layouts import widgetbox
multi_select = MultiSelect(title="Option Works:", options=['a', 'b', 'c'])
multi_select_wrong = MultiSelect(title="Option Wrong:", options=[{'name': 'a', 'value': 'a'}, {'name': 'b', 'value': 'b'}, {'name': 'c', 'value': 'c'}])
show(widgetbox(multi_select, multi_select_wrong))
```

My environment:

```
In [11]: bokeh.__version__
Out[11]: '0.12.1dev2'
```

the `version.js` has `version = '0.12.0'` (perhaps the revision was not updated in the dev-build)

![bokeh_multi_select](https://cloud.githubusercontent.com/assets/6582483/16807957/ca3b5a0e-491a-11e6-9788-cc600ef23444.png)

Thanks for bokeh, it's an incredible tool.



Discussion:
I have compared the Select and MultiSelect code and found that the template of the MultiSelect is missing some pieces. Here is my workaround (No PR -- >Sorry, I'm not so familiar with git and github!!!):

```
<label for="<%= @id %>"> <%= @title %> </label>
<select multiple class="bk-widget-form-input" id="<%=@id %>" name="<%= @name %>">
  <% for option in @options: %>
    <% if typeof option is "string": %>
  <option <% if @value.indexOf(option) > -1: %>selected="selected" <% end %>value="<%= option %>"><%=option%></option>
    <% else: %>
  <option  <% if @value.indexOf(option.value) > -1: %>selected="selected" <% end %>value="<%= option.value %>"><%= option.name %></option>
    <% end %>
  <% end %>
</select>
```

I think this should have a small impact. The python-documentation for Select and MultiSelect should be updated.

As discussed with @bryevdv the naming should/could be improved.
E.g. using `label` and `value` for the `options` entry.

Other tools use the following datatypes and naming:

**Django**:
  `Choices --> list(tuple))   [(value, label), ... ]`
**Angularjs, react.js**
  `[{id: 'id' , name: 'name'}, ...]`  

@bokeh/dev since the current dict format is broken (and has always been?) I'm not averse to changing this to improve it. Instead of 

```
[{'name': 'a', 'value': 'a'}, {'name': 'b', 'value': 'b'}, ...]
```

which is incredibly verbose for no reason, I'd suggest just `(value, label)` tuples:

```
[('a', 'a'), ('b', 'b_label'), ...]
```

I'll plan on submitting a PR later today with this change using @busino 's template changes a starting point unless there's comment. 


Resolving patch:
diff --git a/bokeh/models/widgets/inputs.py b/bokeh/models/widgets/inputs.py
--- a/bokeh/models/widgets/inputs.py
+++ b/bokeh/models/widgets/inputs.py
@@ -6,7 +6,7 @@
 import six
 
 from ...core.properties import abstract
-from ...core.properties import Bool, Int, Float, String, Date, RelativeDelta, Enum, List, Dict, Tuple, Either, Instance
+from ...core.properties import Bool, Int, Float, String, Date, RelativeDelta, Enum, List, Tuple, Either, Instance
 from ..callbacks import Callback
 from .widget import Widget
 from ...core.enums import SliderCallbackPolicy
@@ -73,8 +73,11 @@ class Select(InputWidget):
 
     """
 
-    options = List(Either(String, Dict(String, String)), help="""
-    Available selection options.
+    options = List(Either(String, Tuple(String, String)), help="""
+    Available selection options. Options may be provided either as a list of
+    possible string values, or as a list of tuples, each of the form
+    ``(value, label)``. In the latter case, the visible widget text for each
+    value will be corresponding given label.
     """)
 
     value = String(default="", help="""
@@ -102,8 +105,11 @@ class MultiSelect(InputWidget):
 
     """
 
-    options = List(Either(String, Dict(String, String)), help="""
-    Available selection options.
+    options = List(Either(String, Tuple(String, String)), help="""
+    Available selection options. Options may be provided either as a list of
+    possible string values, or as a list of tuples, each of the form
+    ``(value, label)``. In the latter case, the visible widget text for each
+    value will be corresponding given label.
     """)
 
     value = List(String, help="""
diff --git a/sphinx/source/docs/user_guide/source_examples/interaction_multiselect.py b/sphinx/source/docs/user_guide/source_examples/interaction_multiselect.py
--- a/sphinx/source/docs/user_guide/source_examples/interaction_multiselect.py
+++ b/sphinx/source/docs/user_guide/source_examples/interaction_multiselect.py
@@ -5,6 +5,6 @@
 output_file("multi_select.html")
 
 multi_select = MultiSelect(title="Option:", value=["foo", "quux"],
-                           options=["foo", "bar", "baz", "quux"])
+                           options=[("foo", "Foo"), ("bar", "BAR"), ("baz", "bAz"), ("quux", "quux")])
 
 show(widgetbox(multi_select))


Test patch: