Do not panic on empty quoted string argument
<!--
Please make sure you've read and understood our contributing guidelines;
https://github.com/moby/moby/blob/master/CONTRIBUTING.md

** Make sure all your commits include a signature generated with `git commit -s` **

For additional information on our contributing process, read our contributing
guide https://docs.docker.com/opensource/code/

If this is a bug fix, make sure your description includes "fixes #xxxx", or
"closes #xxxx"

Please provide the following information:
-->

**- What I did**

Fix the handling of empty or single characters command line arguments such as
--tlscacert="" or --tlscacert="'"

**- How I did it**

Ensure the argument is at least 2 characters.

**- How to verify it**

Added a unit test to handle both cases

**- Description for the changelog**
<!--
Write a short (one line) summary that describes the changes in this
pull request for inclusion in the changelog:
-->

Currently, calling `dockerd --tlscacert=""` make Docker to panic.

**- A picture of a cute animal (not mandatory but encouraged)**


opts/quotedstring.go
package opts // import "github.com/docker/docker/opts"

// QuotedString is a string that may have extra quotes around the value. The
// quotes are stripped from the value.
type QuotedString struct {
	value *string
}

// Set sets a new value
func (s *QuotedString) Set(val string) error {
	*s.value = trimQuotes(val)
	return nil
}

// Type returns the type of the value
func (s *QuotedString) Type() string {
	return "string"
}

func (s *QuotedString) String() string {
	return *s.value
}

func trimQuotes(value string) string {
	lastIndex := len(value) - 1
	for _, char := range []byte{'\'', '"'} {
		if value[0] == char && value[lastIndex] == char {
			return value[1:lastIndex]
		}
	}
	return value
}

// NewQuotedString returns a new quoted string option
func NewQuotedString(value *string) *QuotedString {
	return &QuotedString{value: value}
}

package opts // import "github.com/docker/docker/opts"

// QuotedString is a string that may have extra quotes around the value. The
// quotes are stripped from the value.
type QuotedString struct {
	value *string
}

// Set sets a new value
func (s *QuotedString) Set(val string) error {
	*s.value = trimQuotes(val)
	return nil
}

// Type returns the type of the value
func (s *QuotedString) Type() string {
	return "string"
}

func (s *QuotedString) String() string {
	return *s.value
}

func trimQuotes(value string) string {
	if len(value) < 2 {
		return value
	}

	lastIndex := len(value) - 1
	for _, char := range []byte{'\'', '"'} {
		if value[0] == char && value[lastIndex] == char {
			return value[1:lastIndex]
		}
	}
	return value
}

// NewQuotedString returns a new quoted string option
func NewQuotedString(value *string) *QuotedString {
	return &QuotedString{value: value}
}

Not really important, but I was looking at the `for .. range` loop here, which felt a bit over-complicated, and could just be checking for both variants (`'` , `"`);

```go
func trimQuotes(value string) string {
	if len(value) < 2 {
		return value
	}
	if (value[0] == '\'' || value[0] == '"') && value[len(value)-1] == value[0] {
		return value[1 : len(value)-1]
	}
	return value
}
```

Doing a quick bench shows that it's at least more performance (0.3ns vs 5.1ns, so ~ 15x faster)

```
BenchmarkTrimQuotes-8       	228469384	         5.175 ns/op	       0 B/op	       0 allocs/op
BenchmarkTrimQuotes_new-8   	1000000000	         0.3302 ns/op	       0 B/op	       0 allocs/op
```


No need to change in this PR (it's a really tiny optimisation, and not in a critical code-path), but perhaps I'll do a follow-up after this.