Use Hash#each_key instead of Hash#keys.each

`Hash#keys.each` allocates an array of keys; `Hash#each_key` iterates through the keys without allocating a new array. This is the reason why `Hash#each_key` exists.

This is a more comprehensive pull request that closes #17083.

###### Benchmark

```ruby
require 'benchmark/ips'

HASH = Hash[*('a'..'z')]

def slow
  HASH.keys.each{ |k| }
end

def fast
  HASH.each_key{ |k| }
end

Benchmark.ips do |x|
  x.report("slow") { fast }
  x.report("fast") { slow }
end
```

###### Ruby 2.1.2p95

```
slow 757563.3 (±12.4%) i/s - 3721810 in 4.999106s
fast 823996.2 (±12.8%) i/s - 4032560 in 4.999773s
```

###### Ruby 2.0.0p481

```
slow 524888.2 (±12.9%) i/s - 2605078 in 5.038467s
fast 798119.1 (±11.3%) i/s - 3986304 in 5.057280s
```

###### Ruby 1.9.3p545

```
slow 534873.6 (±11.7%) i/s - 2651360 in 5.026394s
fast 796742.4 (±11.1%) i/s - 3944075 in 5.010889s
```
@rafaelfranca Here’s the benchmark for this case. Looks to be about the same to me. Maybe slightly faster than before, but within the margin of error. Let me know if you prefer it the way it was before.

```ruby
require 'benchmark/ips'

HASH = Hash[*('a'..'z')]

def slow
  HASH.keys.each_with_object({}) { |k, o|  o[k] = true }
end

def fast
  HASH.each_key.with_object({}) { |k, o|  o[k] = true }
end

Benchmark.ips do |x|
  x.report('slow') { fast }
  x.report('fast') { slow }
end
```

###### Ruby 2.0.0p481

```
slow 130915.7 (±9.5%) i/s - 657480 in 5.067625s
fast 141726.7 (±9.8%) i/s - 707136 in 5.051534s
```

###### Ruby 2.0.0p481

```
slow 123723.5 (±18.3%) i/s - 597000 in 5.001748s
fast 128207.5 (±12.9%) i/s - 638060 in 5.063480s
```

###### Ruby 1.9.3p545

```
slow 145456.7 (±10.3%) i/s - 720940 in 5.009201s
fast 147682.4 (±11.4%) i/s - 739869 in 5.079606s
```