Add a mean to get an index, allowing iterations of the queue.

With this change, one can iterate over the queue:

```go
for i := 0; i < q.Length(); i++ {
	if q.Get(i).(int) != i {
		t.Errorf("index %d doesn't contain %d", i, i)
	}
}
```

Tests output:

```
$ go test -v 
=== RUN TestQueueLength
--- PASS: TestQueueLength (0.00 seconds)
=== RUN TestQueueGet
--- PASS: TestQueueGet (0.01 seconds)
=== RUN TestQueueGetOORPanic
--- PASS: TestQueueGetOORPanic (0.00 seconds)
	queue_test.go:51: got panic as expected: index out of range
	queue_test.go:65: got panic as expected: index out of range
PASS
ok  	github.com/eapache/queue	0.022s
```
Adding bound checks to the other methods also has a much less significant impact:

Without bound check:
```bash
$ go test -bench .                                                                        
PASS
BenchmarkQueueSerial	50000000	        74.7 ns/op
BenchmarkQueueGet	100000000	        14.1 ns/op
BenchmarkQueueTickTock	100000000	        29.8 ns/op
ok  	github.com/eapache/queue	19.643s
```

With bound check:
```bash
$ go test -bench .
PASS
BenchmarkQueueSerial	50000000	        74.9 ns/op
BenchmarkQueueGet	100000000	        15.8 ns/op
BenchmarkQueueTickTock	50000000	        30.0 ns/op
ok  	github.com/eapache/queue	12.211s
```

I think it would definitely be a good idea to have bound checks.