HW #8

One of the killers here is that you never ended up making an `is_legal_move()` *method* for the generic `ChessPiece` class (See step 8). You tried to set one up in the constructor as an instance attribute but it needed to be a function so it could be overridden in other classes.  This way, we have:

`ChessPiece.is_legal_move()` and `ChessPiece.move()` calls `self.is_legal_move()` just as you've done it (only as a function not as an instance attribute). What can happen is we can create a subsequent class like a Rook and *override* `is_legal_move()`. The rook can still use its parent class' `ChessPiece.move()` since nothing about that function needs to change and by creating a new `is_legal_move()` when a Rook instance calls `self.is_legal_move()` it will call `Rook.is_legal_move()` instead of `ChessPiece.is_legal_move()`