Make rand work with AbstractArray instead of only with Range 

This is essentially two changes:
1) the semi-public API to get a RandIntGen object generating random integers in `1:n` is via a call to `randintgen(n)`. This is to be able in particular to extend the mechanism to `BigInt` for which the existing type `RandIntGen` doesn't fit well (cf. https://github.com/JuliaLang/julia/pull/8255). In the process, `RandIntGen` was simplified by making the first element of the range equal to 1: this was only used with this value AFAICS, and this was duplicating indexing logic as noted by @ivarne (who found that this change should not break packages in METADATA.jl). It seems this was first implemented in commit ab97911 by @lindahua: was there a use for the first element field `.a` that I overlooked?
2) allow `rand(r)` to work for any indexable `r`, not only with ranges (e.g. `rand(["head", "tail"])`. It is really the continuation of commit 48f27bc, and overlaps a bit with #6003. This change is so small that I think it is harmless, whatever is done wrt #6003.

ps: I think the random.jl tests are not very safe as the seed is set the same at each run. Could the content of `__init__` function from base/random.jl be made a public function named e.g. `srand()`, which could be used in the tests?
@ivarne: you are right that the message is not ideal, but I didn't know the best way to change it. The invariant in an inner constructor seems like a good idea. From the user POV, the range is gone not because there is no an `a` field anymore, but because she can use other things (array-like) than ranges. The message could be "the collection passed to rand/rand! must not be empty" ("collection" is used in the docs).