Add <optgroup> support to selectInput()/selectizeInput()

A test case:

```r
states = setNames(state.abb, state.name)
runApp(list(
  ui = fluidPage(
    selectInput('x1', 'X1', states),
    checkboxGroupInput('x2', 'X2', states, inline=TRUE),
    radioButtons('x3', 'X3', states),
    selectizeInput('x4', 'X4', list(
      Eastern = c(`New York` = 'NY', `New Jersey` = 'NJ'),
      Western = c(`California` = 'CA', `Washington` = 'WA')
    ), multiple = TRUE),
    verbatimTextOutput('y1'),
    verbatimTextOutput('y2'),
    verbatimTextOutput('y3'),
    verbatimTextOutput('y4')
  ),
  server = function(input, output, session) {
    updateSelectInput(session, 'x1', 'X One',
                      c(states, `District of Columbia` = 'DC'),
                      selected = 'IA')
    updateCheckboxGroupInput(session, 'x2', choices = states[1:10])
    updateRadioButtons(session, 'x3', choices=sample(states, 5), inline=TRUE)
    updateSelectizeInput(session, 'x4', choices=list(
      Eastern = c(`Rhode Island` = 'RI', `New Jersey` = 'NJ'),
      Western = c(`Oregon` = 'OR', `Washington` = 'WA'),
      Middle = c(Iowa = 'IA')
    ))
    output$y1 = renderPrint(input$x1)
    output$y2 = renderPrint(input$x2)
    output$y3 = renderPrint(input$x3)
    output$y4 = renderPrint(input$x4)
  }
))
```
This part looks too tricky to me - I'd really prefer a more straightforward way of accomplishing the same goal.